zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit fa9b0fa6d37f5ce61e7b36acd48cccb0d4fe71cc (tree)
parent 39119088f968c36ec72ad0ebb69e02ce31b5a033
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date:   Tue,  4 Feb 2025 06:33:36 -0500

x86_64: rewrite most of the remaining float ops

Diffstat:
Mbuild.zig | 2+-
Msrc/arch/x86_64/CodeGen.zig | 35780++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Msrc/arch/x86_64/bits.zig | 14++++++++------
Msrc/arch/x86_64/encodings.zig | 2+-
Mtest/behavior/floatop.zig | 33++++++++++++++++++---------------
Mtest/behavior/muladd.zig | 22+++++++++-------------
Mtest/behavior/vector.zig | 2+-
Mtest/behavior/x86_64/math.zig | 418+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
8 files changed, 24909 insertions(+), 11364 deletions(-)

diff --git a/build.zig b/build.zig @@ -450,7 +450,7 @@ pub fn build(b: *std.Build) !void { .skip_non_native = skip_non_native, .skip_libc = skip_libc, .use_llvm = use_llvm, - .max_rss = 1.25 * 1024 * 1024 * 1024, + .max_rss = 2 * 1024 * 1024 * 1024, })); test_modules_step.dependOn(tests.addModuleTests(b, .{ diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig @@ -2414,7 +2414,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { - @setEvalBranchQuota(5_500); + @setEvalBranchQuota(9_200); const pt = cg.pt; const zcu = pt.zcu; const ip = &zcu.intern_pool; @@ -2450,23 +2450,15 @@ 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, .add_wrap, - .sub, .sub_wrap, => |air_tag| try cg.airBinOp(inst, air_tag), .shr, .shr_exact => try cg.airShlShrBinOp(inst), .shl, .shl_exact => try cg.airShlShrBinOp(inst), - .mul, .mul_wrap, - .rem, .mod, - .div_float, - .div_trunc, - .div_floor, - .div_exact, => |air_tag| try cg.airMulDivBinOp(inst, air_tag), .add_sat => try cg.airAddSat(inst), @@ -2474,23 +2466,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .mul_sat => try cg.airMulSat(inst), .shl_sat => try cg.airShlSat(inst), - .sin, - .cos, - .tan, - .exp, - .exp2, - .log, - .log2, - .log10, - .round, - => |air_tag| try cg.airUnaryMath(inst, air_tag), - - .floor => try cg.airRound(inst, .{ .mode = .down, .precision = .inexact }), - .ceil => try cg.airRound(inst, .{ .mode = .up, .precision = .inexact }), - .trunc_float => try cg.airRound(inst, .{ .mode = .zero, .precision = .inexact }), - .sqrt => try cg.airSqrt(inst), - .neg => |air_tag| try cg.airFloatSign(inst, air_tag), - .add_with_overflow => try cg.airAddSubWithOverflow(inst), .sub_with_overflow => try cg.airAddSubWithOverflow(inst), .mul_with_overflow => try cg.airMulWithOverflow(inst), @@ -2524,7 +2499,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .reduce => try cg.airReduce(inst), .aggregate_init => try cg.airAggregateInit(inst), .prefetch => try cg.airPrefetch(inst), - .mul_add => try cg.airMulAdd(inst), .atomic_store_unordered => try cg.airAtomicStore(inst, .unordered), .atomic_store_monotonic => try cg.airAtomicStore(inst, .monotonic), @@ -2548,16 +2522,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .intcast_safe, => return cg.fail("TODO implement safety_checked_instructions", .{}), - .add_optimized => try cg.airBinOp(inst, .add), - .sub_optimized => try cg.airBinOp(inst, .sub), - .mul_optimized => try cg.airBinOp(inst, .mul), - .div_float_optimized => try cg.airMulDivBinOp(inst, .div_float), - .div_trunc_optimized => try cg.airMulDivBinOp(inst, .div_trunc), - .div_floor_optimized => try cg.airMulDivBinOp(inst, .div_floor), - .div_exact_optimized => try cg.airMulDivBinOp(inst, .div_exact), - .rem_optimized => try cg.airMulDivBinOp(inst, .rem), .mod_optimized => try cg.airMulDivBinOp(inst, .mod), - .neg_optimized => try cg.airFloatSign(inst, .neg), .reduce_optimized => try cg.airReduce(inst), .int_from_float_optimized => try cg.airIntFromFloat(inst), @@ -2575,490 +2540,661 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { if (arg != .none) break; } else try cg.airDbgVarArgs(); }, - .ptr_add => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + .add, .add_optimized => |air_tag| if (use_old) try cg.airBinOp(inst, .add) else fallback: { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airBinOp(inst, air_tag); var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); - try ops[0].toSlicePtr(cg); var res: [1]Temp = undefined; - if (ty_pl.ty.toType().elemType2(zcu).hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{ty_pl.ty.toType()}, &ops, comptime &.{ .{ - .patterns = &.{ - .{ .src = .{ .to_gpr, .simm32 } }, + cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leaa(.src0, .add_src0_elem_size_times_src1), ._, ._ }, - } }, - }, .{ - .dst_constraints = .{.{ .elem_size_is = 1 }}, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0d, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 2 }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"2", .src1), ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 2 + 1 }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"2", .src1), ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .add, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 4 }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"4", .src1), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .add, .dst0y, .dst0y, .tmp0y, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 4 + 1 }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"4", .src1), ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .tmp2y, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .dst_constraints = .{.{ .elem_size_is = 8 }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"8", .src1), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .dst_constraints = .{.{ .elem_size_is = 8 + 1 }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"8", .src1), ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .dst_constraints = .{.po2_elem_size}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_mut_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, - .clobbers = .{ .eflags = true }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._l, .sh, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .add_src0_elem_size), ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, - } }, - } }) 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, - } else { // hack around Sema OPV bugs - res[0] = ops[0]; - } - try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); - }, - .ptr_sub => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; - var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); - try ops[0].toSlicePtr(cg); - var res: [1]Temp = undefined; - if (ty_pl.ty.toType().elemType2(zcu).hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{ty_pl.ty.toType()}, &ops, comptime &.{ .{ .patterns = &.{ - .{ .src = .{ .to_gpr, .simm32 } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leaa(.src0, .sub_src0_elem_size_times_src1), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 1 }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_mut_gpr } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .neg, .src1p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + .{ ._, .v_ss, .add, .dst0x, .src0x, .src1d, ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 2 }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_mut_gpr } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .neg, .src1p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"2", .src1), ._, ._ }, + .{ ._, ._ss, .add, .dst0x, .src1d, ._, ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 2 + 1 }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"2", .src1), ._, ._ }, - .{ ._, ._, .neg, .dst0p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + .{ ._, .v_ps, .add, .dst0x, .src0x, .src1x, ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 4 }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_mut_gpr } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .neg, .src1p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"4", .src1), ._, ._ }, + .{ ._, ._ps, .add, .dst0x, .src1x, ._, ._ }, } }, }, .{ - .dst_constraints = .{.{ .elem_size_is = 4 + 1 }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"4", .src1), ._, ._ }, - .{ ._, ._, .neg, .dst0p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + .{ ._, .v_ps, .add, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .dst_constraints = .{.{ .elem_size_is = 8 }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_mut_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .neg, .src1p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"8", .src1), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .dst_constraints = .{.{ .elem_size_is = 8 + 1 }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"8", .src1), ._, ._ }, - .{ ._, ._, .neg, .dst0p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .dst_constraints = .{.po2_elem_size}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_gpr, .to_mut_gpr } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src1 }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._l, .sa, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ }, - .{ ._, ._, .neg, .src1p, ._, ._, ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + .{ ._, .v_sd, .add, .dst0x, .src0x, .src1q, ._ }, } }, }, .{ - .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .sub_src0_elem_size), ._ }, - .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, - } }, - } }) 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, - } else { - // hack around Sema OPV bugs - res[0] = ops[0]; - } - try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); - }, - .max => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else { - const bin_op = air_datas[@intFromEnum(inst)].bin_op; - 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 = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ }, + .{ ._, ._sd, .add, .dst0x, .src1q, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } }, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mem, .mem, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, + .extra_temps = .{ + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, + .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1q, ._, ._, ._ }, + .{ ._, .f_p, .add, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ }, + .{ ._, .v_pd, .add, .dst0x, .src0x, .src1x, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } }, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, + .{ ._, ._pd, .add, .dst0x, .src1x, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._l, .cmov, .dst0w, .src1w, ._, ._ }, + .{ ._, .v_pd, .add, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._b, .cmov, .dst0w, .src1w, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._l, .cmov, .dst0q, .src1q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._b, .cmov, .dst0q, .src1q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .add, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_signed_int, .any_signed_int }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, .unused, .unused, .unused, @@ -3066,34 +3202,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .rc = .x87 }}, .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, - .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, - .{ ._, ._l, .cmov, .tmp0p, .tmp1p, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ ._, .f_p, .add, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_signed_int, .any_signed_int }, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, .unused, .unused, .unused, @@ -3101,34 +3232,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .rc = .x87 }}, .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, - .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, - .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .add, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_unsigned_int, .any_unsigned_int }, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -3137,31 +3260,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, - .{ ._, ._b, .cmov, .tmp0p, .tmp1p, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .add, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_unsigned_int, .any_unsigned_int }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } }, + .unused, + .unused, .unused, .unused, .unused, @@ -3169,100 +3291,93 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, - .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, .vp_b, .maxs, .dst0x, .src0x, .src1x, ._ }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .p_b, .maxs, .dst0x, .src1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ }, - .{ ._, .p_b, .cmpgt, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, - .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .vp_b, .maxs, .dst0y, .src0y, .src1y, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } }, .unused, .unused, .unused, @@ -3270,27 +3385,45 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_b, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, - }, .{ - .required_features = .{ .avx, null, null, null }, + } }) 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 => |air_tag| if (use_old) try cg.airBinOp(inst, .sub) else fallback: { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airBinOp(inst, air_tag); + 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 = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, .unused, .unused, .unused, @@ -3299,28 +3432,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_b, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .sub, .dst0x, .dst0x, .tmp0d, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subhf3" } } }, + .unused, .unused, .unused, .unused, @@ -3329,29 +3461,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_b, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, .unused, .unused, .unused, @@ -3359,33 +3490,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, - .{ ._, .p_b, .cmpgt, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ }, - .{ ._, .p_, .andn, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .sub, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .cmov, .slow_incdec, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, .unused, .unused, .unused, @@ -3393,31 +3521,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, - .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .sub, .dst0y, .dst0y, .tmp0y, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -3428,29 +3552,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, - .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .sub, .tmp1y, .tmp1y, .tmp2y, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subhf3" } } }, .unused, .unused, .unused, @@ -3458,180 +3583,215 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ + .required_features = .{ .sse4_1, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subhf3" } } }, .unused, .unused, .unused, .unused, .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subhf3" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, .mmx, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } }, - .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_mmx, .mem } }, - .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mmx, .to_mmx } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subhf3" } } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .p_b, .maxu, .dst0q, .src1q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_b, .maxu, .dst0x, .src0x, .src1x, ._ }, + .{ ._, .v_ss, .sub, .dst0x, .src0x, .src1d, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_b, .maxu, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ss, .sub, .dst0x, .src1d, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_b, .maxu, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_ps, .sub, .dst0x, .src0x, .src1x, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_b, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._ps, .sub, .dst0x, .src1x, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_b, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .sub, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -3643,26 +3803,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_b, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, .slow_incdec, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -3673,90 +3834,56 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, - .{ ._, ._b, .cmov, .tmp1d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, - .{ ._, ._b, .cmov, .tmp1d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_sd, .sub, .dst0x, .src0x, .src1q, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._sd, .sub, .dst0x, .src1q, ._, ._ }, } }, }, .{ + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -3766,89 +3893,70 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse, .mmx, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, - .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mut_mmx, .mem } }, - .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mmx, .to_mmx } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_w, .maxs, .dst0q, .src1q, ._, ._ }, + .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1q, ._, ._, ._ }, + .{ ._, .f_p, .sub, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .maxs, .dst0x, .src0x, .src1x, ._ }, + .{ ._, .v_pd, .sub, .dst0x, .src0x, .src1x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_w, .maxs, .dst0x, .src1x, ._, ._ }, + .{ ._, ._pd, .sub, .dst0x, .src1x, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, - .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .maxs, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_pd, .sub, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -3860,25 +3968,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_w, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -3890,26 +3999,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_w, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -3918,27 +4028,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_w, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .sub, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -3947,28 +4058,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._l, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ ._, .f_p, .sub, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, .unused, .unused, .unused, @@ -3977,92 +4086,54 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - }, - .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, .vp_w, .maxu, .dst0x, .src0x, .src1x, ._ }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, .p_w, .maxu, .dst0x, .src1x, ._, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .subr, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_w, .subus, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_w, .add, .dst0x, .src1x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, - }, - .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .maxu, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .sub, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -4071,27 +4142,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_w, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .sub, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subtf3" } } }, + .unused, .unused, .unused, .unused, @@ -4100,30 +4173,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_w, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subtf3" } } }, .unused, .unused, .unused, @@ -4131,29 +4201,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_w, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subtf3" } } }, .unused, .unused, .unused, @@ -4161,30 +4234,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_w, .subus, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_w, .add, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__subtf3" } } }, .unused, .unused, .unused, @@ -4192,27 +4267,45 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._b, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, - }, .{ + } }) 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 fallback: { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airMulDivBinOp(inst, .mul); + 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 = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, .unused, .unused, .unused, @@ -4221,94 +4314,87 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .mul, .dst0x, .dst0x, .tmp0d, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, .vp_d, .maxs, .dst0x, .src0x, .src1x, ._ }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__mulhf3" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .p_d, .maxs, .dst0x, .src1x, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ }, - .{ ._, .p_d, .cmpgt, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, - .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, - .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .maxs, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .mul, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, .unused, .unused, .unused, @@ -4317,29 +4403,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_d, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .mul, .dst0y, .dst0y, .tmp0y, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -4350,27 +4434,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_d, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .mul, .tmp1y, .tmp1y, .tmp2y, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__mulhf3" } } }, .unused, .unused, .unused, @@ -4378,29 +4465,33 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_d, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .sse4_1, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__mulhf3" } } }, .unused, .unused, .unused, @@ -4408,172 +4499,186 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, - .{ ._, .p_d, .cmpgt, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ }, - .{ ._, .p_, .andn, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, - .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__mulhf3" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._l, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, - .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__mulhf3" } } }, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .maxu, .dst0x, .src0x, .src1x, ._ }, + .{ ._, .v_ss, .mul, .dst0x, .src0x, .src1d, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_d, .maxu, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ss, .mul, .dst0x, .src1d, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .mul, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, - .dst_temps = .{.{ .rc = .sse }}, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._dqa, .mov, .dst0x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, - .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ }, - .{ ._, .p_, .xor, .tmp2x, .src1x, ._, ._ }, - .{ ._, .p_d, .cmpgt, .dst0x, .tmp2x, ._, ._ }, - .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, - .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, + .{ ._, ._ps, .mul, .dst0x, .src1x, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .maxu, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_ps, .mul, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -4585,25 +4690,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_d, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .mul, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -4615,25 +4721,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_d, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mul, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .mul, .dst0x, .src0x, .src1q, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._sd, .mul, .dst0x, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -4643,67 +4782,73 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_d, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1q, ._, ._, ._ }, + .{ ._, .f_p, .mul, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .mul, .dst0x, .src0x, .src1x, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .mul, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp5x, .tmp3x, ._, ._ }, - .{ ._, ._dqa, .mov, .tmp6x, .tmp4x, ._, ._ }, - .{ ._, .p_, .xor, .tmp5x, .tmp2x, ._, ._ }, - .{ ._, .p_, .xor, .tmp6x, .tmp2x, ._, ._ }, - .{ ._, .p_d, .cmpgt, .tmp5x, .tmp6x, ._, ._ }, - .{ ._, .p_, .@"and", .tmp3x, .tmp5x, ._, ._ }, - .{ ._, .p_, .andn, .tmp5x, .tmp4x, ._, ._ }, - .{ ._, .p_, .@"or", .tmp3x, .tmp5x, ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_pd, .mul, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -4715,25 +4860,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._b, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .mul, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -4745,43 +4891,57 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .mul, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, .vp_q, .cmpgt, .dst0x, .src1x, .src0x, ._ }, - .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .mul, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_2, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ - .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } }, - .unused, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -4790,40 +4950,57 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, ._dqa, .mov, .tmp0x, .src1x, ._, ._ }, - .{ ._, .p_q, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp0x, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ ._, .f_p, .mul, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, - .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .cmpgt, .dst0y, .src1y, .src0y, ._ }, - .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .mul, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, .unused, .unused, .unused, @@ -4831,63 +5008,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_q, .cmpgt, .tmp3y, .tmp2y, .tmp1y, ._ }, - .{ ._, .vp_b, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .mul, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__multf3" } } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_q, .cmpgt, .tmp3x, .tmp2x, .tmp1x, ._ }, - .{ ._, .vp_b, .blendv, .tmp1x, .tmp1x, .tmp2x, .tmp3x }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, - .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__multf3" } } }, .unused, .unused, .unused, @@ -4895,32 +5067,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, .p_q, .cmpgt, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, .p_b, .blendv, .tmp1x, .tmp2x, .tmp3x, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, - .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__multf3" } } }, .unused, .unused, .unused, @@ -4928,30 +5100,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._l, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, - .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__multf3" } } }, .unused, .unused, .unused, @@ -4959,32 +5133,50 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, - }, .{ - .required_features = .{ .avx, null, null, null }, + } }) 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); + }, + .div_float, .div_float_optimized, .div_exact, .div_exact_optimized => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, switch (air_tag) { + else => unreachable, + .div_float, .div_float_optimized => .div_float, + .div_exact, .div_exact_optimized => .div_exact, + }) else fallback: { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airMulDivBinOp(inst, .div_exact); + 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 = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, .unused, .unused, .unused, @@ -4992,31 +5184,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .v_, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, - .{ ._, .vp_, .xor, .dst0x, .tmp2x, .src0x, ._ }, - .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .src1x, ._ }, - .{ ._, .vp_q, .cmpgt, .dst0x, .tmp2x, .dst0x, ._ }, - .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .div, .dst0x, .dst0x, .tmp0d, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .sse4_2, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, - .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, @@ -5024,30 +5214,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, .p_, .xor, .tmp2x, .src0x, ._, ._ }, - .{ ._, .p_, .xor, .tmp3x, .src1x, ._, ._ }, - .{ ._, .p_q, .cmpgt, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp3x, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, - .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, .unused, .unused, .unused, @@ -5055,139 +5242,126 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.tmp0q), ._, ._ }, - .{ ._, .vp_, .xor, .dst0y, .tmp2y, .src0y, ._ }, - .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .src1y, ._ }, - .{ ._, .vp_q, .cmpgt, .dst0y, .tmp2y, .dst0y, ._ }, - .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .div, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.tmp0q), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_, .xor, .tmp5y, .tmp3y, .tmp2y, ._ }, - .{ ._, .vp_, .xor, .tmp6y, .tmp4y, .tmp2y, ._ }, - .{ ._, .vp_q, .cmpgt, .tmp5y, .tmp6y, .tmp5y, ._ }, - .{ ._, .vp_b, .blendv, .tmp3y, .tmp3y, .tmp4y, .tmp5y }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .div, .dst0y, .dst0y, .tmp0y, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, .unused, .unused, }, .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .v_, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .vp_, .xor, .tmp5x, .tmp3x, .tmp2x, ._ }, - .{ ._, .vp_, .xor, .tmp6x, .tmp4x, .tmp2x, ._ }, - .{ ._, .vp_q, .cmpgt, .tmp5x, .tmp6x, .tmp5x, ._ }, - .{ ._, .vp_b, .blendv, .tmp3x, .tmp3x, .tmp4x, .tmp5x }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .div, .tmp1y, .tmp1y, .tmp2y, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_2, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .unused, + .unused, + .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp5x, .tmp2x, ._, ._ }, - .{ ._, ._dqa, .mov, .tmp6x, .tmp2x, ._, ._ }, - .{ ._, ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .p_, .xor, .tmp5x, .tmp3x, ._, ._ }, - .{ ._, .p_, .xor, .tmp6x, .tmp4x, ._, ._ }, - .{ ._, .p_q, .cmpgt, .tmp6x, .tmp5x, ._, ._ }, - .{ ._, .p_b, .blendv, .tmp3x, .tmp4x, .tmp6x, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, + .required_features = .{ .sse4_1, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, .unused, .unused, .unused, @@ -5195,212 +5369,181 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._b, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, - .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, ._c, .cl, ._, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, - .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, - .{ ._, ._l, .cmov, .tmp1p, .tmp2p, ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, ._c, .cl, ._, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, - .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, - .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, - .{ .@"1:", ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ss, .div, .dst0x, .src0x, .src1d, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ss, .div, .dst0x, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, ._c, .cl, ._, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, - .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ }, - .{ ._, ._b, .cmov, .tmp1p, .tmp2p, ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .div, .dst0x, .src0x, .src1x, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .div, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, ._c, .cl, ._, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, - .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ }, - .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ }, - .{ .@"1:", ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .div, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .word, .is = .word } }, - .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ - .{ .type = .f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, - .{ .type = .f16, .kind = .{ .rc = .sse } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -5409,28 +5552,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, - .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, - .{ ._, .v_ss, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) }, - .{ ._, .v_ss, .max, .dst0x, .tmp0x, .dst0x, ._ }, - .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x }, - .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .div, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .word, .is = .word } }, - .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -5439,58 +5583,59 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .div, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .qword, .is = .word } }, - .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse } }, - .{ .src = .{ .to_sse, .to_sse } }, - }, - .extra_temps = .{ - .{ .type = .vector_4_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, - .{ .type = .vector_4_f16, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, - .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, - .{ ._, .v_ps, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) }, - .{ ._, .v_ps, .max, .dst0x, .tmp0x, .dst0x, ._ }, - .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x }, - .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + .{ ._, .v_sd, .div, .dst0x, .src0x, .src1q, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .word } }, - .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._sd, .div, .dst0x, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ - .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -5499,96 +5644,73 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, - .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, - .{ ._, .v_ps, .cmp, .tmp1y, .dst0y, .dst0y, .vp(.unord) }, - .{ ._, .v_ps, .max, .dst0y, .tmp0y, .dst0y, ._ }, - .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .tmp0y, .tmp1y }, - .{ ._, .v_, .cvtps2ph, .dst0q, .dst0y, .rm(.{}), ._ }, + .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1q, ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .div, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, - .{ ._, .v_ps, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, - .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, - .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_size), .tmp1y, .rm(.{}), ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._pd, .div, .dst0x, .src1x, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, - .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_size), .ui(0) }, - .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0) }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_pd, .div, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, + .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, .unused, .unused, .unused, @@ -5596,103 +5718,90 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, - .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, - .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .div, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, - .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, - .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp4w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .div, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, - .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, - .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, - .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .dword, .is = .dword } }, - .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ - .{ .type = .f32, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -5701,39 +5810,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .v_ss, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, - .{ ._, .v_ss, .max, .dst0x, .src1x, .src0x, ._ }, - .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .dword, .is = .dword } }, - .{ .scalar_float = .{ .of = .dword, .is = .dword } }, - }, - .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ }, - .{ ._, ._ss, .max, .dst0x, .src0x, ._, ._ }, - .{ ._, ._ss, .cmp, .src0x, .src0x, .vp(.unord), ._ }, - .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .dword, .is = .dword } }, - .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -5743,26 +5838,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ }, - .{ ._, ._ss, .max, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._ss, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, - .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ }, - .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .divr, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .dword } }, - .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -5772,45 +5866,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .v_ps, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, - .{ ._, .v_ps, .max, .dst0x, .src1x, .src0x, ._ }, - .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .dword } }, - .{ .scalar_float = .{ .of = .xword, .is = .dword } }, - }, - .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } }, - .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } }, - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ }, - .{ ._, ._ps, .max, .dst0x, .src0x, ._, ._ }, - .{ ._, ._ps, .cmp, .src0x, .src0x, .vp(.unord), ._ }, - .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .div, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, + .required_features = .{ .x87, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .dword } }, - .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -5818,26 +5893,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ }, - .{ ._, ._ps, .max, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._ps, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, - .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ }, - .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, + .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .scalar_float = .{ .of = .yword, .is = .dword } }, - .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, .unused, .unused, .unused, @@ -5847,26 +5925,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_ps, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) }, - .{ ._, .v_ps, .max, .dst0y, .src1y, .src0y, ._ }, - .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .src1y, .tmp0y }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, - .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, .unused, .unused, .unused, @@ -5874,32 +5953,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_ps, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, - .{ ._, .v_ps, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, - .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, - .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, + .required_features = .{ .sse2, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_f32, .kind = .{ .reg = .xmm0 } }, - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, .unused, .unused, .unused, @@ -5907,33 +5986,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._ps, .max, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, - .{ ._, ._ps, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, - .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, .unused, .unused, .unused, @@ -5941,712 +6019,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._ps, .max, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ }, - .{ ._, ._ps, .@"and", .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .andn, .tmp1x, .tmp2x, ._, ._ }, - .{ ._, ._ps, .@"or", .tmp1x, .tmp3x, ._, ._ }, - .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, - }, - .extra_temps = .{ - .{ .type = .f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .v_sd, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, - .{ ._, .v_sd, .max, .dst0x, .src1x, .src0x, ._ }, - .{ ._, .v_pd, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ }, - .{ ._, ._sd, .max, .dst0x, .src0x, ._, ._ }, - .{ ._, ._sd, .cmp, .src0x, .src0x, .vp(.unord), ._ }, - .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .to_sse } }, - }, - .extra_temps = .{ - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ }, - .{ ._, ._sd, .max, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._sd, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, - .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ }, - .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - .{ .scalar_float = .{ .of = .qword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmax" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .qword } }, - .{ .scalar_float = .{ .of = .xword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, - }, - .extra_temps = .{ - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .v_pd, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, - .{ ._, .v_pd, .max, .dst0x, .src1x, .src0x, ._ }, - .{ ._, .v_pd, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .qword } }, - .{ .scalar_float = .{ .of = .xword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } }, - .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } }, - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ }, - .{ ._, ._pd, .max, .dst0x, .src0x, ._, ._ }, - .{ ._, ._pd, .cmp, .src0x, .src0x, .vp(.unord), ._ }, - .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .qword } }, - .{ .scalar_float = .{ .of = .xword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, - }, - .extra_temps = .{ - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ }, - .{ ._, ._pd, .max, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._pd, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, - .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ }, - .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .yword, .is = .qword } }, - .{ .scalar_float = .{ .of = .yword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, - }, - .extra_temps = .{ - .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .v_pd, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) }, - .{ ._, .v_pd, .max, .dst0y, .src1y, .src0y, ._ }, - .{ ._, .v_pd, .blendv, .dst0y, .dst0y, .src1y, .tmp0y }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, - .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_pd, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_pd, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, - .{ ._, .v_pd, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, - .{ ._, .v_pd, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, - .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._pd, .max, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, - .{ ._, ._pd, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, - .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._pd, .max, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ }, - .{ ._, ._pd, .@"and", .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._pd, .andn, .tmp1x, .tmp2x, ._, ._ }, - .{ ._, ._pd, .@"or", .tmp1x, .tmp3x, ._, ._ }, - .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, - .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmax" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, - .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .x87, .cmov, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, - .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, - }, - .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src1, .rc = .x87 } }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, - .{ ._, .f_, .ucomi, .tmp0t, .tmp0t, ._, ._ }, - .{ ._, .f_u, .cmov, .tmp0t, .src1t, ._, ._ }, - .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, - .{ ._, .f_, .ucomi, .tmp0t, .src1t, ._, ._ }, - .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, - .{ ._, .f_nb, .cmov, .tmp0t, .src1t, ._, ._ }, - .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, - .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, - }, - .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .{ .type = .u8, .kind = .{ .reg = .ah } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src1, .rc = .x87 } }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, - .{ ._, .f_, .ucom, .tmp0t, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, - .{ ._, ._, .sahf, ._, ._, ._, ._ }, - .{ ._, ._p, .j, .@"0f", ._, ._, ._ }, - .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, - .{ ._, .f_, .ucom, .src1t, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, - .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, - .{ ._, ._, .sahf, ._, ._, ._, ._ }, - .{ ._, ._b, .j, .@"1f", ._, ._, ._ }, - .{ .@"0:", .f_p, .st, .tmp0t, ._, ._, ._ }, - .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, - .{ .@"1:", .f_p, .st, .dst0t, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, - .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, - }, - .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .{ .type = .u8, .kind = .{ .reg = .ah } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src1, .rc = .x87 } }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, - .{ ._, .f_, .xam, ._, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, - .{ ._, ._, .@"test", .tmp1b, .si(0b1_000_100), ._, ._ }, - .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, - .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, - .{ ._, .f_, .ucom, .src1t, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, - .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, - .{ ._, ._, .@"test", .tmp1b, .si(0b0_000_001), ._, ._ }, - .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, - .{ .@"0:", .f_p, .st, .tmp0t, ._, ._, ._ }, - .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, - .{ .@"1:", .f_p, .st, .dst0t, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .x87, .cmov, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_, .ucomi, .tmp1t, .tmp1t, ._, ._ }, - .{ ._, .f_u, .cmov, .tmp1t, .tmp2t, ._, ._ }, - .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, - .{ ._, .f_, .ucomi, .tmp1t, .tmp2t, ._, ._ }, - .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, - .{ ._, .f_nb, .cmov, .tmp1t, .tmp2t, ._, ._ }, - .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .{ .type = .u8, .kind = .{ .reg = .ah } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_, .ucom, .tmp1t, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, - .{ ._, ._, .sahf, ._, ._, ._, ._ }, - .{ ._, ._p, .j, .@"1f", ._, ._, ._ }, - .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, - .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, - .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, - .{ ._, ._, .sahf, ._, ._, ._, ._ }, - .{ ._, ._b, .j, .@"2f", ._, ._, ._ }, - .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ }, - .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ }, - .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .{ .type = .u8, .kind = .{ .reg = .ah } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_, .xam, ._, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, - .{ ._, ._, .@"test", .tmp3b, .si(0b1_000_100), ._, ._ }, - .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, - .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, - .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ }, - .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, - .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, - .{ ._, ._, .@"test", .tmp3b, .si(0b0_000_001), ._, ._ }, - .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, - .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ }, - .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ }, - .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ - .{ .scalar_float = .{ .of = .xword, .is = .xword } }, - .{ .scalar_float = .{ .of = .xword, .is = .xword } }, - }, - .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, - .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, @@ -6661,455 +6040,7677 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }; try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); }, - .min => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else { + .div_trunc, .div_floor => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, air_tag) else fallback: { const bin_op = air_datas[@intFromEnum(inst)].bin_op; + if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airMulDivBinOp(inst, air_tag); 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 = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, - .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._ge, .cmov, .dst0w, .src1w, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._ae, .cmov, .dst0w, .src1w, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, - .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, - .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._ge, .cmov, .dst0q, .src1q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._ae, .cmov, .dst0q, .src1q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } }, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, - .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_signed_int, .any_signed_int }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, - .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, - .{ ._, ._ge, .cmov, .tmp0p, .tmp1p, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_signed_int, .any_signed_int }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, - .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, - .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_unsigned_int, .any_unsigned_int }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, - .{ ._, ._ae, .cmov, .tmp0p, .tmp1p, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_unsigned_int, .any_unsigned_int }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .reg = .rsi } }, - .{ .type = .u64, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rcx } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .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), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, - .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, .vp_b, .mins, .dst0x, .src0x, .src1x, ._ }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_b, .mins, .dst0x, .src1x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, ._dqa, .mov, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_b, .cmpgt, .dst0x, .src0x, ._, ._ }, - .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, - .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, - .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ - .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, - .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, - }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, .vp_b, .mins, .dst0y, .src0y, .src1y, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, - .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, - }, - .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ + cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, switch (@as(bits.RoundMode.Direction, switch (air_tag) { + else => unreachable, + .div_trunc => .zero, + .div_floor => .down, + })) { + else => unreachable, + inline .zero, .down => |direction| comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .div, .dst0x, .dst0x, .tmp0d, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .dst0q, ._, ._ }, + .{ ._, .v_ss, .round, .dst0x, .dst0x, .dst0d, .rm(.{ .direction = direction, .precision = .inexact }) }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .div, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .dst0q, ._, ._ }, + .{ ._, .v_ps, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .div, .dst0y, .dst0y, .tmp0y, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, + .{ ._, .v_ps, .cvtph2, .dst0y, .dst0x, ._, ._ }, + .{ ._, .v_ps, .round, .dst0y, .dst0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .div, .tmp1y, .tmp1y, .tmp2y, ._ }, + .{ ._, .v_, .cvtps2ph, .tmp1x, .tmp1y, .rm(.{}), ._ }, + .{ ._, .v_ps, .cvtph2, .tmp1y, .tmp1x, ._, ._ }, + .{ ._, .v_ps, .round, .tmp1y, .tmp1y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp5d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp5w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp6d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ss, .div, .dst0x, .src0x, .src1d, ._ }, + .{ ._, .v_ss, .round, .dst0x, .dst0x, .dst0d, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ss, .div, .dst0x, .src1d, ._, ._ }, + .{ ._, ._ss, .round, .dst0x, .dst0d, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncf", + .down => "floorf", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ss, .div, .dst0x, .src1d, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .div, .dst0x, .src0x, .src1x, ._ }, + .{ ._, .v_ps, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .div, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ps, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncf", + .down => "floorf", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ss, .div, .tmp1x, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .div, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_ps, .round, .dst0y, .dst0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .div, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_ps, .round, .tmp1y, .tmp1y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .div, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .round, .tmp1x, .tmp1x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .div, .dst0x, .src0x, .src1q, ._ }, + .{ ._, .v_sd, .round, .dst0x, .dst0x, .dst0q, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._sd, .div, .dst0x, .src1q, ._, ._ }, + .{ ._, ._sd, .round, .dst0x, .dst0q, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._sd, .div, .dst0x, .src1q, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divdf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .div, .dst0x, .src0x, .src1x, ._ }, + .{ ._, .v_pd, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .div, .dst0x, .src1x, ._, ._ }, + .{ ._, ._pd, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .div, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_pd, .round, .dst0y, .dst0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .div, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_pd, .round, .tmp1y, .tmp1y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .div, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .round, .tmp1x, .tmp1x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sd, .div, .tmp1x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divdf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp2t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_x87, .mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .divr, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp1t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .div, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp1t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp3t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }, + }) 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); + }, + .div_trunc_optimized, .div_floor_optimized => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, switch (air_tag) { + else => unreachable, + .div_trunc_optimized => .div_trunc, + .div_floor_optimized => .div_floor, + }) else { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + 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, switch (@as(bits.RoundMode.Direction, switch (air_tag) { + else => unreachable, + .div_trunc_optimized => .zero, + .div_floor_optimized => .down, + })) { + else => unreachable, + inline .zero, .down => |direction| comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .div, .dst0x, .dst0x, .tmp0d, ._ }, + .{ ._, .v_ss, .round, .dst0x, .dst0x, .dst0d, .rm(.{ .direction = direction, .precision = .inexact }) }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .div, .dst0x, .dst0x, .tmp0x, ._ }, + .{ ._, .v_ps, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .div, .dst0y, .dst0y, .tmp0y, ._ }, + .{ ._, .v_ps, .round, .dst0y, .dst0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .div, .tmp1y, .tmp1y, .tmp2y, ._ }, + .{ ._, .v_ps, .round, .tmp1y, .tmp1y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp5d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp5w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divhf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__trunch", + .down => "__floorh", + } } } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp6d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ss, .div, .dst0x, .src0x, .src1d, ._ }, + .{ ._, .v_ss, .round, .dst0x, .dst0x, .dst0d, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ss, .div, .dst0x, .src1d, ._, ._ }, + .{ ._, ._ss, .round, .dst0x, .dst0d, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncf", + .down => "floorf", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ss, .div, .dst0x, .src1d, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .div, .dst0x, .src0x, .src1x, ._ }, + .{ ._, .v_ps, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .div, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ps, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncf", + .down => "floorf", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ss, .div, .tmp1x, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .div, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_ps, .round, .dst0y, .dst0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .div, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_ps, .round, .tmp1y, .tmp1y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .div, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .round, .tmp1x, .tmp1x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .div, .dst0x, .src0x, .src1q, ._ }, + .{ ._, .v_sd, .round, .dst0x, .dst0x, .dst0q, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._sd, .div, .dst0x, .src1q, ._, ._ }, + .{ ._, ._sd, .round, .dst0x, .dst0q, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._sd, .div, .dst0x, .src1q, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divdf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .div, .dst0x, .src0x, .src1x, ._ }, + .{ ._, .v_pd, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .div, .dst0x, .src1x, ._, ._ }, + .{ ._, ._pd, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .div, .dst0y, .src0y, .src1y, ._ }, + .{ ._, .v_pd, .round, .dst0y, .dst0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .div, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_pd, .round, .tmp1y, .tmp1y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .div, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .round, .tmp1x, .tmp1x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sd, .div, .tmp1x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divdf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "trunc", + .down => "floor", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp2t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_x87, .mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .divr, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp1t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .div, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp1t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "__truncx", + .down => "__floorx", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .div, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .mem(.tmp3t), ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divtf3" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .zero => "truncq", + .down => "floorq", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }, + }) 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); + }, + .rem, .rem_optimized => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, .rem) else fallback: { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airMulDivBinOp(inst, .rem); + 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 = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodh" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodh" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodh" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodh" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodh" } } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmodf" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f32, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmodf" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ss, .mov, .tmp2x, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f32, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmodf" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ss, .mov, .tmp2x, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmod" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmod" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_sd, .mov, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmod" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sd, .mov, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmod" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .size = 16 * 2, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp0x, .mem(.src1x), ._, ._ }, + .{ ._, .v_dqa, .mov, .memd(.tmp1x, 16), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .size = 16 * 2, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp0x, .mem(.src1x), ._, ._ }, + .{ ._, ._dqa, .mov, .memd(.tmp1x, 16), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .size = 16 * 2, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._ps, .mova, .tmp0x, .mem(.src1x), ._, ._ }, + .{ ._, ._ps, .mova, .memd(.tmp1x, 16), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .size = 16 * 2, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memd(.tmp2x, 16), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .size = 16 * 2, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memd(.tmp2x, 16), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .size = 16 * 2, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmodx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._ps, .mova, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memd(.tmp2x, 16), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmodq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmodq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmodq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmodq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }) 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); + }, + .ptr_add => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + try ops[0].toSlicePtr(cg); + var res: [1]Temp = undefined; + if (ty_pl.ty.toType().elemType2(zcu).hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{ty_pl.ty.toType()}, &ops, comptime &.{ .{ + .patterns = &.{ + .{ .src = .{ .to_gpr, .simm32, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leaa(.src0, .add_src0_elem_size_times_src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 2 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"2", .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 2 + 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"2", .src1), ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 4 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"4", .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 4 + 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"4", .src1), ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .elem_size_is = 8 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"8", .src1), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .elem_size_is = 8 + 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"8", .src1), ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.po2_elem_size}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._l, .sh, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + } }, + }, .{ + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .add_src0_elem_size), ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + } }) 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, + } else { // hack around Sema OPV bugs + res[0] = ops[0]; + } + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .ptr_sub => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + try ops[0].toSlicePtr(cg); + var res: [1]Temp = undefined; + if (ty_pl.ty.toType().elemType2(zcu).hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{ty_pl.ty.toType()}, &ops, comptime &.{ .{ + .patterns = &.{ + .{ .src = .{ .to_gpr, .simm32, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leaa(.src0, .sub_src0_elem_size_times_src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .neg, .src1p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 2 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .neg, .src1p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"2", .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 2 + 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"2", .src1), ._, ._ }, + .{ ._, ._, .neg, .dst0p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 4 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .neg, .src1p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"4", .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .elem_size_is = 4 + 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"4", .src1), ._, ._ }, + .{ ._, ._, .neg, .dst0p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .elem_size_is = 8 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .neg, .src1p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leasi(.src0, .@"8", .src1), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .elem_size_is = 8 + 1 }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .dst0p, .leasi(.src1, .@"8", .src1), ._, ._ }, + .{ ._, ._, .neg, .dst0p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.po2_elem_size}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_mut_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src1 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._l, .sa, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ }, + .{ ._, ._, .neg, .src1p, ._, ._, ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .src1), ._, ._ }, + } }, + }, .{ + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .sub_src0_elem_size), ._ }, + .{ ._, ._, .lea, .dst0p, .leai(.src0, .dst0), ._, ._ }, + } }, + } }) 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, + } else { + // hack around Sema OPV bugs + res[0] = ops[0]; + } + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .max => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + 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 = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._l, .cmov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._b, .cmov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._l, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._b, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._l, .cmov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._b, .cmov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .any_signed_int, .any_signed_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._l, .cmov, .tmp0p, .tmp1p, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_signed_int, .any_signed_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._nl, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .any_unsigned_int, .any_unsigned_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._b, .cmov, .tmp0p, .tmp1p, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_unsigned_int, .any_unsigned_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._nb, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_b, .maxs, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_b, .maxs, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ }, + .{ ._, .p_b, .cmpgt, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_b, .maxs, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_b, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_b, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_b, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, + .{ ._, .p_b, .cmpgt, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ }, + .{ ._, .p_, .andn, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, + .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .movsx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, + .{ ._, ._l, .cmov, .tmp1d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .mmx, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } }, + .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_mmx, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mmx, .to_mmx, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_b, .maxu, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_b, .maxu, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_b, .maxu, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_b, .maxu, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_b, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_b, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_b, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, + .{ ._, ._b, .cmov, .tmp1d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .movzx, .tmp2d, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .tmp2b, ._, ._ }, + .{ ._, ._b, .cmov, .tmp1d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1b, .memia(.src1b, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .mmx, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, + .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_mmx, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mmx, .to_mmx, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_w, .maxs, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .maxs, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_w, .maxs, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, + .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .maxs, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_w, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_w, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_w, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._l, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .maxu, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_w, .maxu, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_w, .subus, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_w, .add, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .maxu, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_w, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_w, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_w, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_w, .subus, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_w, .add, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._b, .cmov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1w, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .maxs, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_d, .maxs, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .dst0x, .src0x, ._, ._ }, + .{ ._, .p_d, .cmpgt, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .maxs, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_d, .maxs, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_d, .maxs, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_d, .maxs, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, + .{ ._, .p_d, .cmpgt, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_, .@"and", .tmp2x, .tmp1x, ._, ._ }, + .{ ._, .p_, .andn, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_, .@"or", .tmp1x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._l, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .maxu, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_d, .maxu, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ }, + .{ ._, .p_, .xor, .dst0x, .src0x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .src1x, ._, ._ }, + .{ ._, .p_d, .cmpgt, .dst0x, .tmp2x, ._, ._ }, + .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .maxu, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_d, .maxu, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_d, .maxu, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_d, .maxu, .tmp1x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp5x, .tmp3x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp6x, .tmp4x, ._, ._ }, + .{ ._, .p_, .xor, .tmp5x, .tmp2x, ._, ._ }, + .{ ._, .p_, .xor, .tmp6x, .tmp2x, ._, ._ }, + .{ ._, .p_d, .cmpgt, .tmp5x, .tmp6x, ._, ._ }, + .{ ._, .p_, .@"and", .tmp3x, .tmp5x, ._, ._ }, + .{ ._, .p_, .andn, .tmp5x, .tmp4x, ._, ._ }, + .{ ._, .p_, .@"or", .tmp3x, .tmp5x, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._b, .cmov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .memia(.src1d, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_q, .cmpgt, .dst0x, .src1x, .src0x, ._ }, + .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x }, + } }, + }, .{ + .required_features = .{ .sse4_2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .src1x, ._, ._ }, + .{ ._, .p_q, .cmpgt, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_q, .cmpgt, .dst0y, .src1y, .src0y, ._ }, + .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_q, .cmpgt, .tmp3y, .tmp2y, .tmp1y, ._ }, + .{ ._, .vp_b, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_q, .cmpgt, .tmp3x, .tmp2x, .tmp1x, ._ }, + .{ ._, .vp_b, .blendv, .tmp1x, .tmp1x, .tmp2x, .tmp3x }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, .p_q, .cmpgt, .tmp3x, .tmp1x, ._, ._ }, + .{ ._, .p_b, .blendv, .tmp1x, .tmp2x, .tmp3x, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._l, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, + .{ ._, .vp_, .xor, .dst0x, .tmp2x, .src0x, ._ }, + .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .src1x, ._ }, + .{ ._, .vp_q, .cmpgt, .dst0x, .tmp2x, .dst0x, ._ }, + .{ ._, .vp_b, .blendv, .dst0x, .src0x, .src1x, .dst0x }, + } }, + }, .{ + .required_features = .{ .sse4_2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .src0x, ._, ._ }, + .{ ._, .p_, .xor, .tmp3x, .src1x, ._, ._ }, + .{ ._, .p_q, .cmpgt, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, .p_b, .blendv, .dst0x, .src1x, .tmp3x, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.tmp0q), ._, ._ }, + .{ ._, .vp_, .xor, .dst0y, .tmp2y, .src0y, ._ }, + .{ ._, .vp_, .xor, .tmp2y, .tmp2y, .src1y, ._ }, + .{ ._, .vp_q, .cmpgt, .dst0y, .tmp2y, .dst0y, ._ }, + .{ ._, .vp_b, .blendv, .dst0y, .src0y, .src1y, .dst0y }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_q, .broadcast, .tmp2y, .lea(.tmp0q), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp4y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_, .xor, .tmp5y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .xor, .tmp6y, .tmp4y, .tmp2y, ._ }, + .{ ._, .vp_q, .cmpgt, .tmp5y, .tmp6y, .tmp5y, ._ }, + .{ ._, .vp_b, .blendv, .tmp3y, .tmp3y, .tmp4y, .tmp5y }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .vp_, .xor, .tmp5x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_, .xor, .tmp6x, .tmp4x, .tmp2x, ._ }, + .{ ._, .vp_q, .cmpgt, .tmp5x, .tmp6x, .tmp5x, ._ }, + .{ ._, .vp_b, .blendv, .tmp3x, .tmp3x, .tmp4x, .tmp5x }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._, .movddup, .tmp2x, .lea(.tmp0q), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp5x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp6x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_, .xor, .tmp5x, .tmp3x, ._, ._ }, + .{ ._, .p_, .xor, .tmp6x, .tmp4x, ._, ._ }, + .{ ._, .p_q, .cmpgt, .tmp6x, .tmp5x, ._, ._ }, + .{ ._, .p_b, .blendv, .tmp3x, .tmp4x, .tmp6x, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._b, .cmov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .cmp, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, + .{ ._, ._l, .cmov, .tmp1p, .tmp2p, ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .sia(-1, .none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memiad(.src0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, + .{ ._, ._nl, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memiad(.src1, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, + .{ .@"1:", ._, .lea, .tmp2p, .memiad(.dst0, .tmp0, .add_size_sub_elem_size, 8), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ }, + .{ ._, ._b, .cmov, .tmp1p, .tmp2p, ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, ._c, .cl, ._, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp2q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sbb, .tmp2q, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .lead(.tmp0, 8), ._, ._ }, + .{ ._, ._c, .de, .tmp1d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_sub_elem_size), ._, ._ }, + .{ ._, ._nb, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .memia(.src1, .tmp0, .add_size_sub_elem_size), ._, ._ }, + .{ .@"1:", ._, .lea, .tmp2p, .memia(.dst0, .tmp0, .add_size_sub_elem_size), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.none, .add_src0_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0p, .tmp0p, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .cmp, .tmp1x, .dst0d, .dst0x, .vp(.unord) }, + .{ ._, .v_ss, .max, .dst0x, .tmp0d, .dst0x, ._ }, + .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) }, + .{ ._, .v_ps, .max, .dst0x, .tmp0x, .dst0x, ._ }, + .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp1y, .dst0y, .dst0y, .vp(.unord) }, + .{ ._, .v_ps, .max, .dst0y, .tmp0y, .dst0y, ._ }, + .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .tmp0y, .tmp1y }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, + .{ ._, .v_ps, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, + .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ss, .cmp, .tmp0x, .src0x, .src0d, .vp(.unord) }, + .{ ._, .v_ss, .max, .dst0x, .src1x, .src0d, ._ }, + .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ss, .max, .dst0x, .src0d, ._, ._ }, + .{ ._, ._ss, .cmp, .src0x, .src0d, .sp(.unord), ._ }, + .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ }, + .{ ._, ._ss, .max, .tmp0x, .src0d, ._, ._ }, + .{ ._, ._ss, .cmp, .dst0x, .src0d, .sp(.ord), ._ }, + .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ }, + .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, + .{ ._, .v_ps, .max, .dst0x, .src1x, .src0x, ._ }, + .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .xmm0 }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ps, .max, .dst0x, .src0x, ._, ._ }, + .{ ._, ._ps, .cmp, .src0x, .src0x, .sp(.unord), ._ }, + .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ }, + .{ ._, ._ps, .max, .tmp0x, .src0x, ._, ._ }, + .{ ._, ._ps, .cmp, .dst0x, .src0x, .sp(.ord), ._ }, + .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ }, + .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) }, + .{ ._, .v_ps, .max, .dst0y, .src1y, .src0y, ._ }, + .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .src1y, .tmp0y }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, + .{ ._, .v_ps, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, + .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .max, .tmp3x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .sp(.unord), ._ }, + .{ ._, ._ps, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .max, .tmp3x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .sp(.ord), ._ }, + .{ ._, ._ps, .@"and", .tmp3x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .andn, .tmp1x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .@"or", .tmp1x, .tmp3x, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .cmp, .tmp0x, .src0x, .src0q, .vp(.unord) }, + .{ ._, .v_sd, .max, .dst0x, .src1x, .src0q, ._ }, + .{ ._, .v_pd, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ }, + .{ ._, ._sd, .max, .dst0x, .src0q, ._, ._ }, + .{ ._, ._sd, .cmp, .src0x, .src0q, .sp(.unord), ._ }, + .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ }, + .{ ._, ._sd, .max, .tmp0x, .src0q, ._, ._ }, + .{ ._, ._sd, .cmp, .dst0x, .src0q, .sp(.ord), ._ }, + .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ }, + .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmax" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, + .{ ._, .v_pd, .max, .dst0x, .src1x, .src0x, ._ }, + .{ ._, .v_pd, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .xmm0 }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ }, + .{ ._, ._pd, .max, .dst0x, .src0x, ._, ._ }, + .{ ._, ._pd, .cmp, .src0x, .src0x, .sp(.unord), ._ }, + .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ }, + .{ ._, ._pd, .max, .tmp0x, .src0x, ._, ._ }, + .{ ._, ._pd, .cmp, .dst0x, .src0x, .sp(.ord), ._ }, + .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ }, + .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) }, + .{ ._, .v_pd, .max, .dst0y, .src1y, .src0y, ._ }, + .{ ._, .v_pd, .blendv, .dst0y, .dst0y, .src1y, .tmp0y }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_pd, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_pd, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) }, + .{ ._, .v_pd, .max, .tmp1y, .tmp2y, .tmp1y, ._ }, + .{ ._, .v_pd, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._pd, .max, .tmp3x, .tmp1x, ._, ._ }, + .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .sp(.unord), ._ }, + .{ ._, ._pd, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._pd, .max, .tmp3x, .tmp1x, ._, ._ }, + .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .sp(.ord), ._ }, + .{ ._, ._pd, .@"and", .tmp3x, .tmp1x, ._, ._ }, + .{ ._, ._pd, .andn, .tmp1x, .tmp2x, ._, ._ }, + .{ ._, ._pd, .@"or", .tmp1x, .tmp3x, ._, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmax" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, .cmov, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src1, .rc = .x87 } }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ucomi, .tmp0t, .tmp0t, ._, ._ }, + .{ ._, .f_u, .cmov, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, + .{ ._, .f_, .ucomi, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, + .{ ._, .f_nb, .cmov, .tmp0t, .src1t, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sahf, .x87, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u8, .kind = .{ .reg = .ah } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src1, .rc = .x87 } }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .ucom, .tmp0t, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .sahf, ._, ._, ._, ._ }, + .{ ._, ._p, .j, .@"0f", ._, ._, ._ }, + .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, + .{ ._, .f_, .ucom, .src1t, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, + .{ ._, ._, .sahf, ._, ._, ._, ._ }, + .{ ._, ._b, .j, .@"1f", ._, ._, ._ }, + .{ .@"0:", .f_p, .st, .tmp0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ .@"1:", .f_p, .st, .dst0t, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u8, .kind = .{ .reg = .ah } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src1, .rc = .x87 } }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .xam, ._, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .si(0b1_000_100), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, + .{ ._, .f_, .ucom, .src1t, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp1w, ._, ._, ._ }, + .{ ._, .f_, .xch, .src1t, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .si(0b0_000_001), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ .@"0:", .f_p, .st, .tmp0t, ._, ._, ._ }, + .{ ._, .f_, .ld, .src1t, ._, ._, ._ }, + .{ .@"1:", .f_p, .st, .dst0t, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, .cmov, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ucomi, .tmp1t, .tmp1t, ._, ._ }, + .{ ._, .f_u, .cmov, .tmp1t, .tmp2t, ._, ._ }, + .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, + .{ ._, .f_, .ucomi, .tmp1t, .tmp2t, ._, ._ }, + .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, + .{ ._, .f_nb, .cmov, .tmp1t, .tmp2t, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sahf, .x87, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u8, .kind = .{ .reg = .ah } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ucom, .tmp1t, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, + .{ ._, ._, .sahf, ._, ._, ._, ._ }, + .{ ._, ._p, .j, .@"1f", ._, ._, ._ }, + .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, + .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, + .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, + .{ ._, ._, .sahf, ._, ._, ._, ._ }, + .{ ._, ._b, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ }, + .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ }, + .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u8, .kind = .{ .reg = .ah } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .xam, ._, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp3b, .si(0b1_000_100), ._, ._ }, + .{ ._, ._z, .j, .@"1f", ._, ._, ._ }, + .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, + .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ }, + .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp3b, .si(0b0_000_001), ._, ._ }, + .{ ._, ._nz, .j, .@"2f", ._, ._, ._ }, + .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ }, + .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ }, + .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }) 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); + }, + .min => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + 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 = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, + .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0b, .src1b, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._ge, .cmov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._ae, .cmov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .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 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, + .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0w, .src1w, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._ge, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._ae, .cmov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, + .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .src1d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._ge, .cmov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._ae, .cmov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .cmp, .src0q, .src1q, ._, ._ }, + .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .src1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .any_signed_int, .any_signed_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._ge, .cmov, .tmp0p, .tmp1p, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_signed_int, .any_signed_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._nge, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .any_unsigned_int, .any_unsigned_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src1), ._, ._ }, + .{ ._, ._ae, .cmov, .tmp0p, .tmp1p, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_unsigned_int, .any_unsigned_int, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .reg = .rsi } }, + .{ .type = .u64, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rcx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .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), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src1), ._, ._ }, + .{ .@"0:", ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_b, .mins, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_b, .mins, .dst0x, .src1x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_b, .cmpgt, .dst0x, .src0x, ._, ._ }, + .{ ._, .p_, .@"and", .src0x, .dst0x, ._, ._ }, + .{ ._, .p_, .andn, .dst0x, .src1x, ._, ._ }, + .{ ._, .p_, .@"or", .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .vp_b, .mins, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, .{ ._, .vp_b, .mins, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_size), ._ }, @@ -7122,9 +13723,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7152,9 +13754,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7182,9 +13785,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7216,9 +13820,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7248,9 +13853,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7280,9 +13886,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7311,9 +13918,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7343,11 +13951,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } }, .{ .scalar_unsigned_int = .{ .of = .qword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_mmx, .mem } }, - .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mmx, .to_mmx } }, + .{ .src = .{ .to_mut_mmx, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mmx, .to_mmx, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -7358,11 +13967,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -7373,11 +13983,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -7388,11 +13999,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -7403,9 +14015,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7433,9 +14046,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7463,9 +14077,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7493,9 +14108,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7525,9 +14141,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7557,9 +14174,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7588,9 +14206,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7620,11 +14239,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_mmx, .mem } }, - .{ .src = .{ .mem, .to_mut_mmx }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mmx, .to_mmx } }, + .{ .src = .{ .to_mut_mmx, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mmx, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mmx, .to_mmx, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -7635,11 +14255,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -7650,11 +14271,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -7665,11 +14287,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -7680,9 +14303,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7710,9 +14334,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7740,9 +14365,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7770,9 +14396,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7800,9 +14427,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7832,11 +14460,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -7847,11 +14476,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -7862,11 +14492,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -7879,11 +14510,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -7894,9 +14526,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7924,9 +14557,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7954,9 +14588,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -7984,9 +14619,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8016,9 +14652,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8046,9 +14683,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8078,11 +14716,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -8093,11 +14732,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -8108,11 +14748,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -8127,11 +14768,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -8142,9 +14784,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8172,9 +14815,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8202,9 +14846,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8232,9 +14877,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8266,9 +14912,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8296,9 +14943,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8328,11 +14976,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -8343,11 +14992,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -8358,11 +15008,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -8392,11 +15043,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -8407,9 +15059,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8437,9 +15090,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8467,9 +15121,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8497,9 +15152,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8537,9 +15193,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8567,9 +15224,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8599,11 +15257,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -8615,11 +15274,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_2_i64, .kind = .{ .reg = .xmm0 } }, @@ -8643,11 +15303,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -8659,9 +15320,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8691,9 +15353,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8723,9 +15386,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8756,9 +15420,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8787,9 +15452,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8819,11 +15485,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -8850,11 +15517,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -8882,11 +15550,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -8913,9 +15582,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8949,9 +15619,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -8985,9 +15656,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9023,9 +15695,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9054,9 +15727,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9083,9 +15757,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int }, + .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9122,9 +15796,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int }, + .src_constraints = .{ .any_scalar_signed_int, .any_scalar_signed_int, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9161,9 +15835,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int }, + .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9198,9 +15872,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int }, + .src_constraints = .{ .any_scalar_unsigned_int, .any_scalar_unsigned_int, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9238,9 +15912,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, @@ -9257,8 +15932,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, - .{ ._, .v_ss, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) }, - .{ ._, .v_ss, .min, .dst0x, .tmp0x, .dst0x, ._ }, + .{ ._, .v_ss, .cmp, .tmp1x, .dst0x, .dst0d, .vp(.unord) }, + .{ ._, .v_ss, .min, .dst0x, .tmp0x, .dst0d, ._ }, .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x }, .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, @@ -9267,9 +15942,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -9293,16 +15969,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .vector_4_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, - .{ .type = .vector_4_f16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -9325,16 +16002,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ - .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -9350,22 +16028,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .v_ps, .cmp, .tmp1y, .dst0y, .dst0y, .vp(.unord) }, .{ ._, .v_ps, .min, .dst0y, .tmp0y, .dst0y, ._ }, .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .tmp0y, .tmp1y }, - .{ ._, .v_, .cvtps2ph, .dst0q, .dst0y, .rm(.{}), ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, } }, }, .{ .required_features = .{ .f16c, null, null, null }, .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -9390,9 +16069,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -9423,9 +16103,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -9457,9 +16138,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -9492,9 +16174,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -9530,9 +16213,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .f32, .kind = .{ .rc = .sse } }, @@ -9547,8 +16231,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_ss, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, - .{ ._, .v_ss, .min, .dst0x, .src1x, .src0x, ._ }, + .{ ._, .v_ss, .cmp, .tmp0x, .src0x, .src0d, .vp(.unord) }, + .{ ._, .v_ss, .min, .dst0x, .src1x, .src0d, ._ }, .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, } }, }, .{ @@ -9556,15 +16240,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ }, - .{ ._, ._ss, .min, .dst0x, .src0x, ._, ._ }, - .{ ._, ._ss, .cmp, .src0x, .src0x, .vp(.unord), ._ }, + .{ ._, ._ss, .min, .dst0x, .src0d, ._, ._ }, + .{ ._, ._ss, .cmp, .src0x, .src0d, .sp(.unord), ._ }, .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ }, } }, }, .{ @@ -9572,9 +16257,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, @@ -9590,8 +16276,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ }, - .{ ._, ._ss, .min, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._ss, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, + .{ ._, ._ss, .min, .tmp0x, .src0d, ._, ._ }, + .{ ._, ._ss, .cmp, .dst0x, .src0d, .sp(.ord), ._ }, .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ }, .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ }, .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ }, @@ -9601,9 +16287,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, @@ -9627,17 +16314,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } }, - .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } }, - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .xmm0 }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ }, .{ ._, ._ps, .min, .dst0x, .src0x, ._, ._ }, - .{ ._, ._ps, .cmp, .src0x, .src0x, .vp(.unord), ._ }, + .{ ._, ._ps, .cmp, .src0x, .src0x, .sp(.unord), ._ }, .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ }, } }, }, .{ @@ -9645,11 +16333,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, @@ -9666,7 +16355,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ }, .{ ._, ._ps, .min, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._ps, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, + .{ ._, ._ps, .cmp, .dst0x, .src0x, .sp(.ord), ._ }, .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ }, .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ }, .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ }, @@ -9676,9 +16365,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, @@ -9702,9 +16392,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9735,9 +16426,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9758,7 +16450,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, .{ ._, ._ps, .min, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, + .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .sp(.unord), ._ }, .{ ._, ._ps, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, @@ -9769,9 +16461,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -9792,7 +16485,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, .{ ._, ._ps, .min, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ }, + .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .sp(.ord), ._ }, .{ ._, ._ps, .@"and", .tmp3x, .tmp1x, ._, ._ }, .{ ._, ._ps, .andn, .tmp1x, .tmp2x, ._, ._ }, .{ ._, ._ps, .@"or", .tmp1x, .tmp3x, ._, ._ }, @@ -9805,9 +16498,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .f64, .kind = .{ .rc = .sse } }, @@ -9822,8 +16516,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_sd, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) }, - .{ ._, .v_sd, .min, .dst0x, .src1x, .src0x, ._ }, + .{ ._, .v_sd, .cmp, .tmp0x, .src0x, .src0q, .vp(.unord) }, + .{ ._, .v_sd, .min, .dst0x, .src1x, .src0q, ._ }, .{ ._, .v_pd, .blendv, .dst0x, .dst0x, .src1x, .tmp0x }, } }, }, .{ @@ -9831,15 +16525,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ }, - .{ ._, ._sd, .min, .dst0x, .src0x, ._, ._ }, - .{ ._, ._sd, .cmp, .src0x, .src0x, .vp(.unord), ._ }, + .{ ._, ._sd, .min, .dst0x, .src0q, ._, ._ }, + .{ ._, ._sd, .cmp, .src0x, .src0q, .sp(.unord), ._ }, .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ }, } }, }, .{ @@ -9847,9 +16542,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, @@ -9865,8 +16561,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ }, - .{ ._, ._sd, .min, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._sd, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, + .{ ._, ._sd, .min, .tmp0x, .src0q, ._, ._ }, + .{ ._, ._sd, .cmp, .dst0x, .src0q, .sp(.ord), ._ }, .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ }, .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ }, .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ }, @@ -9876,9 +16572,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -9902,9 +16599,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, @@ -9928,17 +16626,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } }, - .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } }, - .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .mem, .none } }, + .{ .src = .{ .mem, .{ .to_reg = .xmm0 }, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ }, .{ ._, ._pd, .min, .dst0x, .src0x, ._, ._ }, - .{ ._, ._pd, .cmp, .src0x, .src0x, .vp(.unord), ._ }, + .{ ._, ._pd, .cmp, .src0x, .src0x, .sp(.unord), ._ }, .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ }, } }, }, .{ @@ -9946,11 +16645,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, @@ -9967,7 +16667,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ }, .{ ._, ._pd, .min, .tmp0x, .src0x, ._, ._ }, - .{ ._, ._pd, .cmp, .dst0x, .src0x, .vp(.ord), ._ }, + .{ ._, ._pd, .cmp, .dst0x, .src0x, .sp(.ord), ._ }, .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ }, .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ }, .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ }, @@ -9977,9 +16677,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, @@ -10003,9 +16704,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10036,9 +16738,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10059,7 +16762,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, .{ ._, ._pd, .min, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ }, + .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .sp(.unord), ._ }, .{ ._, ._pd, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ }, .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, @@ -10070,9 +16773,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10093,7 +16797,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, .{ ._, ._pd, .min, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ }, + .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .sp(.ord), ._ }, .{ ._, ._pd, .@"and", .tmp3x, .tmp1x, ._, ._ }, .{ ._, ._pd, .andn, .tmp1x, .tmp2x, ._, ._ }, .{ ._, ._pd, .@"or", .tmp1x, .tmp3x, ._, ._ }, @@ -10106,9 +16810,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -10140,11 +16845,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st7 } }, @@ -10172,11 +16878,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st7 } }, @@ -10210,11 +16917,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st7 } }, @@ -10248,9 +16956,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10283,9 +16992,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10324,9 +17034,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10365,9 +17076,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -10391,9 +17103,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -10423,9 +17136,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -10455,9 +17169,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -10529,17 +17244,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { })) { else => unreachable, inline .@"and", .@"or", .xor => |mir_tag| comptime &.{ .{ - .src_constraints = .{ .{ .size = .byte }, .{ .size = .byte } }, + .src_constraints = .{ .{ .size = .byte }, .{ .size = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .imm8 } }, - .{ .src = .{ .imm8, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .imm8 } }, - .{ .src = .{ .imm8, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .imm8, .none } }, + .{ .src = .{ .imm8, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -10547,17 +17262,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, mir_tag, .dst0b, .src1b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .size = .word }, .{ .size = .word } }, + .src_constraints = .{ .{ .size = .word }, .{ .size = .word }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .imm16 } }, - .{ .src = .{ .imm16, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .imm16 } }, - .{ .src = .{ .imm16, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .imm16, .none } }, + .{ .src = .{ .imm16, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -10565,17 +17280,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, mir_tag, .dst0w, .src1w, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .size = .dword }, .{ .size = .dword } }, + .src_constraints = .{ .{ .size = .dword }, .{ .size = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .imm32 } }, - .{ .src = .{ .imm32, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .imm32 } }, - .{ .src = .{ .imm32, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .imm32, .none } }, + .{ .src = .{ .imm32, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -10584,17 +17299,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword } }, + .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .simm32 } }, - .{ .src = .{ .simm32, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .simm32 } }, - .{ .src = .{ .simm32, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .simm32, .none } }, + .{ .src = .{ .simm32, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -10603,11 +17318,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword } }, + .src_constraints = .{ .{ .size = .qword }, .{ .size = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_mm, .mem } }, - .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mm, .to_mm } }, + .{ .src = .{ .to_mut_mm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mm, .to_mm, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -10615,11 +17330,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } }, + .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .mem } }, - .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_xmm, .to_xmm } }, + .{ .src = .{ .to_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -10627,11 +17342,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } }, + .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -10639,11 +17354,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword } }, + .src_constraints = .{ .{ .size = .xword }, .{ .size = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -10651,11 +17366,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword } }, + .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -10663,11 +17378,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword } }, + .src_constraints = .{ .{ .size = .yword }, .{ .size = .yword }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -10675,9 +17390,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword } }, + .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10702,9 +17417,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword } }, + .src_constraints = .{ .{ .multiple_size = .yword }, .{ .multiple_size = .yword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10729,9 +17444,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } }, + .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10756,9 +17471,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } }, + .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10783,9 +17498,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword } }, + .src_constraints = .{ .{ .multiple_size = .xword }, .{ .multiple_size = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10810,9 +17525,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword } }, + .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10836,9 +17551,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword } }, + .src_constraints = .{ .{ .multiple_size = .qword }, .{ .multiple_size = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -10878,20 +17593,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); var res: [1]Temp = undefined; cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ - .src_constraints = .{ .{ .signed_or_exact_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._, .not, .dst0b, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -10899,20 +17614,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_umax), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_or_exact_int = .word }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._, .not, .dst0w, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -10920,20 +17635,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_umax), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_or_exact_int = .dword }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._, .not, .dst0d, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -10942,10 +17657,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ @@ -10953,10 +17668,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ @@ -10965,10 +17680,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_mm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_mm, .none, .none } }, }, .dst_temps = .{.{ .rc = .mmx }}, .each = .{ .once = &.{ @@ -10977,9 +17692,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_mm, .none } }, + .{ .src = .{ .to_mut_mm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -10999,10 +17714,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_xmm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_xmm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11011,9 +17726,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .xword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .none } }, + .{ .src = .{ .to_xmm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11033,10 +17748,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_xmm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_xmm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11045,9 +17760,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .xword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .none } }, + .{ .src = .{ .to_mut_xmm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11067,9 +17782,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .int = .xword }, .any }, + .src_constraints = .{ .{ .int = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .none } }, + .{ .src = .{ .to_mut_xmm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11089,10 +17804,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11101,9 +17816,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .yword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11123,10 +17838,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any }, + .src_constraints = .{ .{ .signed_or_exact_int = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11135,9 +17850,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .yword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11157,9 +17872,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11186,9 +17901,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11213,9 +17928,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11242,9 +17957,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11269,9 +17984,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11296,9 +18011,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11324,9 +18039,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11350,9 +18065,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .signed_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11377,9 +18092,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11404,9 +18119,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11436,9 +18151,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11463,9 +18178,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11491,9 +18206,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11517,9 +18232,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .dword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11548,9 +18263,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11575,9 +18290,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11607,9 +18322,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11633,9 +18348,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11664,9 +18379,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11692,9 +18407,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11723,9 +18438,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11750,9 +18465,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11780,10 +18495,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .signed_int_or_full_vec = .qword }, .any }, + .src_constraints = .{ .{ .signed_int_or_full_vec = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_mm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_mm, .none, .none } }, }, .dst_temps = .{.{ .rc = .mmx }}, .each = .{ .once = &.{ @@ -11792,9 +18507,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .unsigned_int_vec = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int_vec = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_mm, .none } }, + .{ .src = .{ .to_mut_mm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11814,10 +18529,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any }, + .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_xmm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_xmm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11826,9 +18541,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any }, + .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .none } }, + .{ .src = .{ .to_xmm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11848,10 +18563,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any }, + .src_constraints = .{ .{ .signed_int_or_full_vec = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_xmm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_xmm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11860,9 +18575,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any }, + .src_constraints = .{ .{ .unsigned_int_vec = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .none } }, + .{ .src = .{ .to_mut_xmm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11882,9 +18597,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .vec = .xword }, .any }, + .src_constraints = .{ .{ .vec = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .none } }, + .{ .src = .{ .to_mut_xmm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11904,10 +18619,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any }, + .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11916,9 +18631,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any }, + .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11938,10 +18653,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any }, + .src_constraints = .{ .{ .signed_int_or_full_vec = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .dst_temps = .{.{ .rc = .sse }}, .each = .{ .once = &.{ @@ -11950,9 +18665,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any }, + .src_constraints = .{ .{ .unsigned_int_vec = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .none } }, + .{ .src = .{ .to_ymm, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -11973,7 +18688,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .{ .required_features = .{ .@"64bit", null, null, null }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -11999,7 +18714,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -12089,10 +18804,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { var res: [1]Temp = undefined; cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .exact_signed_int = 1 }, .any }, + .src_constraints = .{ .{ .exact_signed_int = 1 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12100,10 +18815,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .add, .dst0b, .si(1), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .exact_signed_int = 1 }, .any }, + .src_constraints = .{ .{ .exact_signed_int = 1 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12111,10 +18826,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._c, .in, .dst0b, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .exact_unsigned_int = 1 }, .any }, + .src_constraints = .{ .{ .exact_unsigned_int = 1 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12123,10 +18838,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .unsigned_or_exact_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12137,10 +18852,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .signed_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12152,9 +18867,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null }, - .src_constraints = .{ .{ .exact_int = 16 }, .any }, + .src_constraints = .{ .{ .exact_int = 16 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12163,10 +18878,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .exact_int = 16 }, .any }, + .src_constraints = .{ .{ .exact_int = 16 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12175,9 +18890,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .signed_int = .word }, .any }, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12188,9 +18903,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null }, - .src_constraints = .{ .{ .unsigned_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12200,10 +18915,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12213,9 +18928,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null }, - .src_constraints = .{ .{ .exact_int = 32 }, .any }, + .src_constraints = .{ .{ .exact_int = 32 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12224,10 +18939,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .exact_int = 32 }, .any }, + .src_constraints = .{ .{ .exact_int = 32 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12236,9 +18951,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .signed_int = .dword }, .any }, + .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12249,9 +18964,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .false_deps_lzcnt_tzcnt, .lzcnt, null, null }, - .src_constraints = .{ .{ .unsigned_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12261,10 +18976,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12274,9 +18989,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .exact_int = 64 }, .any }, + .src_constraints = .{ .{ .exact_int = 64 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12285,10 +19000,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .exact_int = 64 }, .any }, + .src_constraints = .{ .{ .exact_int = 64 }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12297,10 +19012,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .any }, + .src_constraints = .{ .{ .signed_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12312,9 +19027,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12324,10 +19039,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12337,10 +19052,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12364,10 +19079,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .signed_po2_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_po2_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12392,10 +19107,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .signed_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12421,10 +19136,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12449,10 +19164,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12465,10 +19180,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .signed_po2_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_po2_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12482,10 +19197,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .signed_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12511,10 +19226,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12538,10 +19253,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .sbb, .dst0b, .tmp0b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12563,10 +19278,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_po2_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_po2_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12589,10 +19304,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .byte }, .any }, + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12616,10 +19331,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .byte }, .any }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12643,9 +19358,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12657,9 +19372,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .signed_int = .word }, .any }, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12673,9 +19388,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12688,9 +19403,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12702,9 +19417,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .signed_int = .word }, .any }, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12718,9 +19433,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12732,10 +19447,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12745,9 +19460,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .word }, .any }, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, @@ -12770,10 +19485,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .word }, .any }, + .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, @@ -12796,9 +19511,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12810,9 +19525,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .signed_int = .dword }, .any }, + .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12826,9 +19541,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12841,9 +19556,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -12855,9 +19570,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .signed_int = .dword }, .any }, + .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12871,9 +19586,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12885,10 +19600,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .sbb, .dst0b, .src0b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12898,9 +19613,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .dst0b, .sia(-1, .src0, .add_bit_size), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .dword }, .any }, + .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12923,10 +19638,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .sub, .dst0b, .tmp0b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .dword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -12949,9 +19664,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -12963,10 +19678,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .any }, + .src_constraints = .{ .{ .signed_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, @@ -12992,9 +19707,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -13007,9 +19722,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -13021,10 +19736,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .any }, + .src_constraints = .{ .{ .signed_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, @@ -13050,9 +19765,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -13065,10 +19780,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_po2_or_exact_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -13079,10 +19794,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .any }, + .src_constraints = .{ .{ .signed_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, @@ -13107,10 +19822,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .any }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, @@ -13133,9 +19848,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13163,9 +19878,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13192,9 +19907,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13223,9 +19938,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13253,9 +19968,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13283,9 +19998,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13312,9 +20027,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13343,9 +20058,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .unsigned_or_exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13373,9 +20088,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13406,9 +20121,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13438,9 +20153,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13470,9 +20185,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13503,9 +20218,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13535,9 +20250,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -13567,9 +20282,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, .slow_incdec, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13596,9 +20311,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13625,9 +20340,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, .slow_incdec, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13654,9 +20369,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13683,9 +20398,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, .slow_incdec, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13712,9 +20427,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .lzcnt, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13741,9 +20456,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, .slow_incdec, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13770,9 +20485,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13799,9 +20514,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13831,9 +20546,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13863,9 +20578,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13895,9 +20610,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13927,9 +20642,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13957,9 +20672,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .byte }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -13988,9 +20703,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14020,9 +20735,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14052,9 +20767,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14084,9 +20799,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14116,9 +20831,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14146,9 +20861,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .word }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14177,9 +20892,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14209,9 +20924,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14241,9 +20956,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, .slow_incdec, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14273,9 +20988,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .bsf_bsr_0_clobbers_result, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14305,9 +21020,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14335,9 +21050,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .dword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14366,9 +21081,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, .slow_incdec }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14398,9 +21113,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, .bsf_bsr_0_clobbers_result, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14430,9 +21145,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, .slow_incdec, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14462,9 +21177,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .bsf_bsr_0_clobbers_result, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14494,9 +21209,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14525,9 +21240,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .any }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14556,10 +21271,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14596,10 +21311,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14635,10 +21350,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14674,10 +21389,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14714,10 +21429,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14753,10 +21468,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14792,10 +21507,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14832,10 +21547,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14871,10 +21586,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .qword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14910,10 +21625,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .false_deps_lzcnt_tzcnt, .lzcnt, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14950,10 +21665,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .lzcnt, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -14989,10 +21704,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any }, + .src_constraints = .{ .{ .scalar_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .scalar_int_is = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15005,50 +21720,2361 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ }, - .{ .@"1:", ._, .@"and", .tmp3q, .leai(.tmp1q, .tmp2), ._, ._ }, - .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ }, - .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ }, - .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"1b", ._, ._, ._ }, - .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, - .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ }, - .{ ._, ._, .neg, .tmp3d, ._, ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - } }) catch |err| switch (err) { - error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ - @tagName(air_tag), - cg.typeOf(ty_op.operand).fmt(pt), - ops[0].tracking(cg), - }), - else => |e| return e, - }; - try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - - .cmp_vector, .cmp_vector_optimized => |air_tag| if (use_old) try cg.airCmpVector(inst) else fallback: { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const extra = cg.air.extraData(Air.VectorCmp, ty_pl.payload).data; - switch (extra.compareOperator()) { - .eq, .neq => {}, - else => break :fallback try cg.airCmpVector(inst), - } - var ops = try cg.tempsFromOperands(inst, .{ extra.lhs, extra.rhs }); - var res: [1]Temp = undefined; - switch (extra.compareOperator()) { - .lt => unreachable, - .lte => unreachable, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .sia(-8, .none, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .ua(.src0, .add_umax), ._, ._ }, + .{ .@"1:", ._, .@"and", .tmp3q, .leai(.tmp1q, .tmp2), ._, ._ }, + .{ ._, ._r, .bs, .tmp3q, .tmp3q, ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .si(-1), ._, ._ }, + .{ ._, ._, .sub, .tmp2d, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .lea, .tmp3d, .leasiad(.tmp3, .@"8", .tmp2, .sub_src0_bit_size, 1), ._, ._ }, + .{ ._, ._, .neg, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_2_len), .tmp3w, ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ + @tagName(air_tag), + cg.typeOf(ty_op.operand).fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + + .cmp_vector, .cmp_vector_optimized => |air_tag| if (use_old) try cg.airCmpVector(inst) else fallback: { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const extra = cg.air.extraData(Air.VectorCmp, ty_pl.payload).data; + switch (extra.compareOperator()) { + .eq, .neq => {}, + .lt, .lte, .gte, .gt => if (cg.floatBits(cg.typeOf(extra.lhs).childType(zcu)) == null) + break :fallback try cg.airCmpVector(inst), + } + var ops = try cg.tempsFromOperands(inst, .{ extra.lhs, extra.rhs }); + var res: [1]Temp = undefined; + (err: switch (extra.compareOperator()) { + .lt, .lte, .gte, .gt => |cmp_op| { + switch (cmp_op) { + else => unreachable, + .lt, .lte => {}, + .gt, .gte => std.mem.swap(Temp, &ops[0], &ops[1]), + } + break :err cg.select(&res, &.{ty_pl.ty.toType()}, &ops, switch (@as(Condition, switch (cmp_op) { + else => unreachable, + .lt, .gt => .l, + .lte, .gte => .le, + })) { + else => unreachable, + inline .l, .le => |cc| comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ss, .cmp, .dst0x, .dst0x, .tmp0d, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .sse, .mem, .none } }, + .{ .src = .{ .mem, .sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .cmp, .dst0x, .dst0x, .tmp0x, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .extra_temps = .{ + .{ .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .cmp, .dst0y, .dst0y, .tmp0y, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_ss, .cmp, .dst0x, .src0x, .src1d, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref_mask = .{ + .ref = .src0, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, ._ss, .cmp, .dst0x, .src1d, .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cmp, .dst0x, .src0x, .src1x, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref_mask = .{ + .ref = .src0, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .cmp, .dst0x, .src1x, .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .dword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cmp, .dst0y, .src0y, .src1y, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .qword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .cmp, .dst0x, .src0x, .src1q, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref_mask = .{ + .ref = .src0, + .info = .{ .kind = .all, .scalar = .qword }, + } }}, + .each = .{ .once = &.{ + .{ ._, ._sd, .cmp, .dst0x, .src1q, .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .qword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .cmp, .dst0x, .src0x, .src1x, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .ref_mask = .{ + .ref = .src0, + .info = .{ .kind = .all, .scalar = .qword }, + } }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .cmp, .dst0x, .src1x, .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, + }, + .dst_temps = .{.{ .mut_rc_mask = .{ + .ref = .src0, + .rc = .sse, + .info = .{ .kind = .all, .scalar = .qword }, + } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .cmp, .dst0y, .src0y, .src1y, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + } }, + }, .{ + .required_features = .{ .f16c, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp2y, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp3y, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .tmp3y, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_ps, .movmsk, .tmp4d, .tmp2y, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp4b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp2y, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp3y, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .tmp3y, .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_ps, .movmsk, .tmp4d, .tmp2y, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp4b, ._, ._ }, + .{ ._, ._c, .in, .tmp1p, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp6b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ }, + .{ ._, ._, .add, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0) }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp6b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ }, + .{ ._, ._c, .in, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp6b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ }, + .{ ._, ._, .add, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp6b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ }, + .{ ._, ._c, .in, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .{ .type = .f32, .kind = .mem }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp4d, .memsi(.src0w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp1x, .mem(.tmp7d), ._, ._ }, + .{ ._, ._, .movzx, .tmp4d, .memsi(.src1w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp7d), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp6b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ }, + .{ ._, ._, .add, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .{ .type = .f32, .kind = .mem }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp4d, .memsi(.src0w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp1x, .mem(.tmp7d), ._, ._ }, + .{ ._, ._, .movzx, .tmp4d, .memsi(.src1w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp7d), ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ }, + .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp6b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp6d, .tmp5b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp6d, ._, ._ }, + .{ ._, ._c, .in, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .avx, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp3x, .tmp3x, .tmp3x, ._ }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp3x, .memsi(.src0w, .@"2", .tmp0), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp3x, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0) }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ }, + .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .avx, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp3x, .tmp3x, .tmp3x, ._ }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp3x, .memsi(.src0w, .@"2", .tmp0), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp3x, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0) }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse2, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, .p_, .xor, .tmp3x, .tmp3x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ }, + .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse2, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memsi(.src0w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, .p_, .xor, .tmp3x, .tmp3x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp3x, .memsi(.src1w, .@"2", .tmp0), .ui(0), ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .f32, .kind = .mem }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp5d, .memsi(.src0w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp8d), ._, ._ }, + .{ ._, ._, .movzx, .tmp5d, .memsi(.src1w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp8d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ }, + .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + .{ .type = .f32, .kind = .mem }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp5d, .memsi(.src0w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp8d), ._, ._ }, + .{ ._, ._, .movzx, .tmp5d, .memsi(.src1w, .@"2", .tmp0), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp8d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp0d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7q, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .tmp1q, .tmp7q, ._, ._ }, + .{ ._, ._c, .in, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp5d, .tmp0d, ._, ._ }, + .{ ._, ._r, .sh, .tmp5d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp5, -8), .tmp1q, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"1:", ._, .cmp, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp0d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp0d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp0), .tmp1q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_ps, .movmsk, .tmp3d, .tmp2y, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_ps, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_ps, .movmsk, .tmp3d, .tmp2y, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp3b, ._, ._ }, + .{ ._, ._c, .in, .tmp1q, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp3x, .memiad(.src0x, .tmp0, .add_size, 16), ._, ._ }, + .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + .{ ._, ._ps, .cmp, .tmp3x, .memiad(.src1x, .tmp0, .add_size, 16), .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + .{ ._, .p_w, .ackssd, .tmp2x, .tmp3x, ._, ._ }, + .{ ._, .p_b, .ackssw, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_b, .movmsk, .tmp4d, .tmp2x, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp4b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + .{ ._, ._ps, .movmsk, .tmp3d, .tmp2x, ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memiad(.src0x, .tmp0, .add_size, 16), ._, ._ }, + .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, 16), .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + .{ ._, ._ps, .movmsk, .tmp4d, .tmp2x, ._, ._ }, + .{ ._, ._l, .sh, .tmp4b, .ui(4), ._, ._ }, + .{ ._, ._, .@"or", .tmp3b, .tmp4b, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._mp, .j, .@"1f", ._, ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp2x, .memiad(.src0x, .tmp0, .add_size, -16), ._, ._ }, + .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, -16), .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + .{ ._, ._ps, .movmsk, .tmp4d, .tmp2x, ._, ._ }, + .{ ._, ._l, .sh, .tmp4b, .ui(4), ._, ._ }, + .{ ._, ._, .@"or", .tmp3b, .tmp4b, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 1), ._, ._ }, + .{ .@"1:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + .{ ._, ._ps, .movmsk, .tmp3d, .tmp2x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp3b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_pd, .mova, .tmp3y, .memiad(.src0y, .tmp0, .add_size, 32), ._, ._ }, + .{ ._, .v_pd, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_pd, .cmp, .tmp3y, .tmp3y, .memiad(.src1y, .tmp0, .add_size, 32), .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_pd, .movmsk, .tmp4d, .tmp2y, ._, ._ }, + .{ ._, .v_pd, .movmsk, .tmp5d, .tmp3y, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp5b, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp4b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(64), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_pd, .mova, .tmp3y, .memiad(.src0y, .tmp0, .add_size, 32), ._, ._ }, + .{ ._, .v_pd, .cmp, .tmp2y, .tmp2y, .memia(.src1y, .tmp0, .add_size), .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_pd, .cmp, .tmp3y, .tmp3y, .memiad(.src1y, .tmp0, .add_size, 32), .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_pd, .movmsk, .tmp4d, .tmp2y, ._, ._ }, + .{ ._, .v_pd, .movmsk, .tmp5d, .tmp3y, ._, ._ }, + .{ ._, ._l, .sh, .tmp5b, .ui(4), ._, ._ }, + .{ ._, ._, .@"or", .tmp4b, .tmp5b, ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp1b), .tmp4b, ._, ._ }, + .{ ._, ._c, .in, .tmp1q, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(64), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp3y, .memia(.src0y, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_pd, .cmp, .tmp3y, .tmp3y, .memia(.src1y, .tmp0, .add_size), .vp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }) }, + .{ ._, .v_pd, .movmsk, .tmp4d, .tmp3y, ._, ._ }, + .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 4), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp4d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .cmp, .tmp3x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { + else => unreachable, + .l => .lt, + .le => .le, + }), ._ }, + .{ ._, ._pd, .movmsk, .tmp4d, .tmp3x, ._, ._ }, + .{ ._, ._l, .ro, .tmp4b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp4b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 2), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp4d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp4, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, .cmov, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0q, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_p, .ucomi, .tmp4t, .tmp5t, ._, ._ }, + .{ ._, .f_p, .st, .tmp5t, ._, ._, ._ }, + .{ ._, .fromCond(switch (cc) { + else => unreachable, + .l => .a, + .le => .ae, + }), .set, .tmp3b, ._, ._, ._ }, + .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, .cmov, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0q, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_p, .ucomi, .tmp4t, .tmp5t, ._, ._ }, + .{ ._, .f_p, .st, .tmp5t, ._, ._, ._ }, + .{ ._, .fromCond(switch (cc) { + else => unreachable, + .l => .a, + .le => .ae, + }), .set, .tmp3b, ._, ._, ._ }, + .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .{ .type = .u8, .kind = .{ .reg = .ah } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1q, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0q, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_pp, .ucom, ._, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp6w, ._, ._, ._ }, + switch (cc) { + else => unreachable, + .l => .{ ._, ._, .@"test", .tmp6b, .si(0b1_000_001), ._, ._ }, + .le => .{ ._, ._r, .sh, .tmp6b, .ui(1), ._, ._ }, + }, + .{ ._, .fromCond(switch (cc) { + else => unreachable, + .l => .z, + .le => .nc, + }), .set, .tmp3b, ._, ._, ._ }, + .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, .cmov, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_p, .ucomi, .tmp4t, .tmp5t, ._, ._ }, + .{ ._, .f_p, .st, .tmp5t, ._, ._, ._ }, + .{ ._, .fromCond(switch (cc) { + else => unreachable, + .l => .a, + .le => .ae, + }), .set, .tmp3b, ._, ._, ._ }, + .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, .cmov, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_p, .ucomi, .tmp4t, .tmp5t, ._, ._ }, + .{ ._, .f_p, .st, .tmp5t, ._, ._, ._ }, + .{ ._, .fromCond(switch (cc) { + else => unreachable, + .l => .a, + .le => .ae, + }), .set, .tmp3b, ._, ._, ._ }, + .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .rcx } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st6 } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u8, .kind = .{ .reg = .ah } }, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ }, + .{ ._, .f_pp, .ucom, ._, ._, ._, ._ }, + .{ ._, .fn_sw, .st, .tmp6w, ._, ._, ._ }, + switch (cc) { + else => unreachable, + .l => .{ ._, ._, .@"test", .tmp6b, .si(0b1_000_001), ._, ._ }, + .le => .{ ._, ._r, .sh, .tmp6b, .ui(1), ._, ._ }, + }, + .{ ._, .fromCond(switch (cc) { + else => unreachable, + .l => .z, + .le => .nc, + }), .set, .tmp3b, ._, ._, ._ }, + .{ ._, ._l, .ro, .tmp3b, .tmp1b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2b, .tmp3b, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp3d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0b, .tmp3, -1), .tmp2b, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0b, .tmp1), .tmp2b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .slow_incdec, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .dst_constraints = .{.{ .bool_vec = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u32, .kind = .{ .reg = .edx } }, + .unused, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp3x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ }, + .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp7b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp7d, .tmp6b, ._, ._ }, + .{ ._, ._, .@"or", .dst0d, .tmp7d, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .avx, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp8b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp1), .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .avx, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp8b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp1), .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse2, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp8b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp1), .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse2, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp8b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp1), .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse, .slow_incdec, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp8b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .lead(.tmp1, 1), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp1), .tmp2q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .sse, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, + }, + .patterns = &.{ + .{ .src = .{ .to_mem, .to_mem, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .u8, .kind = .{ .reg = .cl } }, + .{ .type = .u64, .kind = .{ .reg = .rdx } }, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp4x, .memia(.src1x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp8d, .tmp8d, ._, ._ }, + .{ ._, ._, .@"test", .tmp6d, .tmp6d, ._, ._ }, + .{ ._, .fromCond(cc), .set, .tmp8b, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp7d, .tmp1d, ._, ._ }, + .{ ._, ._l, .sh, .tmp8q, .tmp7b, ._, ._ }, + .{ ._, ._, .@"or", .tmp2q, .tmp8q, ._, ._ }, + .{ ._, ._c, .in, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._nz, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp6d, .tmp1d, ._, ._ }, + .{ ._, ._r, .sh, .tmp6d, .ui(3), ._, ._ }, + .{ ._, ._, .mov, .memid(.dst0q, .tmp6, -8), .tmp2q, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ .@"1:", ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .si(0b111111), ._, ._ }, + .{ ._, ._z, .j, .@"0f", ._, ._, ._ }, + .{ ._, ._r, .sh, .tmp1d, .ui(6), ._, ._ }, + .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp1), .tmp2q, ._, ._ }, + } }, + } }, + }); + }, .eq, .neq => |cmp_op| cg.select(&res, &.{ty_pl.ty.toType()}, &ops, switch (@as(Condition, switch (cmp_op) { else => unreachable, .eq => .e, @@ -15057,11 +24083,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { else => unreachable, inline .e, .ne => |cc| comptime &.{ .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15077,11 +24103,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15097,11 +24123,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15117,11 +24143,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15137,11 +24163,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .mem } }, - .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_xmm, .to_xmm } }, + .{ .src = .{ .to_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15157,11 +24183,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .mem } }, - .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_xmm, .to_xmm } }, + .{ .src = .{ .to_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15177,11 +24203,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .mem } }, - .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_xmm, .to_xmm } }, + .{ .src = .{ .to_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15197,11 +24223,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .mem } }, - .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_xmm, .to_xmm } }, + .{ .src = .{ .to_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, .rc = .sse, .info = .{ .kind = .all, @@ -15217,11 +24243,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, @@ -15237,11 +24263,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, @@ -15257,11 +24283,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, @@ -15277,11 +24303,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, @@ -15297,11 +24323,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_mm, .mem } }, - .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mm, .to_mm } }, + .{ .src = .{ .to_mut_mm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mm, .to_mm, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, @@ -15317,11 +24343,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_mm, .mem } }, - .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mm, .to_mm } }, + .{ .src = .{ .to_mut_mm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mm, .to_mm, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, @@ -15337,11 +24363,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_mm, .mem } }, - .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mm, .to_mm } }, + .{ .src = .{ .to_mut_mm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mm, .to_mm, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, @@ -15356,17 +24382,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .p_d, .cmpeq, .dst0q, .src1q, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .bool_vec = .byte }, .{ .bool_vec = .byte } }, + .src_constraints = .{ .{ .bool_vec = .byte }, .{ .bool_vec = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .imm8 } }, - .{ .src = .{ .imm8, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .imm8 } }, - .{ .src = .{ .imm8, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .imm8, .none } }, + .{ .src = .{ .imm8, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -15381,17 +24407,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, } }, }, .{ - .src_constraints = .{ .{ .bool_vec = .word }, .{ .bool_vec = .word } }, + .src_constraints = .{ .{ .bool_vec = .word }, .{ .bool_vec = .word }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .imm16 } }, - .{ .src = .{ .imm16, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .imm16 } }, - .{ .src = .{ .imm16, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .imm16, .none } }, + .{ .src = .{ .imm16, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -15406,17 +24432,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, } }, }, .{ - .src_constraints = .{ .{ .bool_vec = .dword }, .{ .bool_vec = .dword } }, + .src_constraints = .{ .{ .bool_vec = .dword }, .{ .bool_vec = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .imm32 } }, - .{ .src = .{ .imm32, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .imm32 } }, - .{ .src = .{ .imm32, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .imm32, .none } }, + .{ .src = .{ .imm32, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -15432,17 +24458,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .bool_vec = .qword }, .{ .bool_vec = .qword } }, + .src_constraints = .{ .{ .bool_vec = .qword }, .{ .bool_vec = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .simm32 } }, - .{ .src = .{ .simm32, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .simm32 } }, - .{ .src = .{ .simm32, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mut_mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mut_mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .mem } }, - .{ .src = .{ .mem, .to_mut_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_gpr, .to_gpr } }, + .{ .src = .{ .mut_mem, .simm32, .none } }, + .{ .src = .{ .simm32, .mut_mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mut_mem, .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 }}, .clobbers = .{ .eflags = true }, @@ -15457,9 +24483,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, } }, }, .{ - .src_constraints = .{ .any_bool_vec, .any_bool_vec }, + .src_constraints = .{ .any_bool_vec, .any_bool_vec, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15496,9 +24522,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15541,9 +24567,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15588,9 +24614,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15633,9 +24659,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15702,9 +24728,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15747,9 +24773,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15794,9 +24820,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15863,9 +24889,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15932,9 +24958,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -15977,9 +25003,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16024,9 +25050,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16093,9 +25119,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16162,9 +25188,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, .mmx, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16207,9 +25233,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, .mmx, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16280,9 +25306,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, .mmx, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16354,10 +25380,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .dst_constraints = .{.{ .bool_vec = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16386,10 +25412,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .dst_constraints = .{.{ .bool_vec = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16418,10 +25444,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .dst_constraints = .{.{ .bool_vec = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16451,10 +25477,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .dst_constraints = .{.{ .bool_vec = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16483,10 +25509,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_int, .any_scalar_int }, + .src_constraints = .{ .any_scalar_int, .any_scalar_int, .any }, .dst_constraints = .{.{ .bool_vec = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -16522,10 +25548,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16555,10 +25581,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16588,10 +25614,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16622,10 +25648,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16655,10 +25681,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_int, .any_scalar_int }, + .src_constraints = .{ .any_scalar_int, .any_scalar_int, .any }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -16696,10 +25722,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .dst_constraints = .{.{ .bool_vec = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16730,10 +25756,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word } }, + .src_constraints = .{ .{ .scalar_int_is = .word }, .{ .scalar_int_is = .word }, .any }, .dst_constraints = .{.{ .bool_vec = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16763,10 +25789,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword } }, + .src_constraints = .{ .{ .scalar_int_is = .dword }, .{ .scalar_int_is = .dword }, .any }, .dst_constraints = .{.{ .bool_vec = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16797,10 +25823,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword } }, + .src_constraints = .{ .{ .scalar_int_is = .qword }, .{ .scalar_int_is = .qword }, .any }, .dst_constraints = .{.{ .bool_vec = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16831,10 +25857,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_int, .any_scalar_int }, + .src_constraints = .{ .any_scalar_int, .any_scalar_int, .any }, .dst_constraints = .{.{ .bool_vec = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -16871,9 +25897,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte } }, + .src_constraints = .{ .{ .scalar_int_is = .byte }, .{ .scalar_int_is = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -16917,9 +25943,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .{ .scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, @@ -16940,7 +25967,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, - .{ ._, .v_ss, .cmp, .dst0x, .dst0x, .tmp0x, .vp(switch (cc) { + .{ ._, .v_ss, .cmp, .dst0x, .dst0x, .tmp0d, .vp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -16951,12 +25978,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, - .{ .src = .{ .sse, .mem } }, - .{ .src = .{ .mem, .sse } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .sse, .mem, .none } }, + .{ .src = .{ .mem, .sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .kind = .{ .rc = .sse } }, @@ -16988,12 +26016,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .mem, .mem, .none } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .kind = .{ .rc = .sse } }, @@ -17025,11 +26054,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, @@ -17037,7 +26067,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .info = .{ .kind = .all, .scalar = .dword }, } }}, .each = .{ .once = &.{ - .{ ._, .v_ss, .cmp, .dst0x, .src0x, .src1x, .vp(switch (cc) { + .{ ._, .v_ss, .cmp, .dst0x, .src0x, .src1d, .vp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -17048,18 +26078,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, .scalar = .dword }, } }}, .each = .{ .once = &.{ - .{ ._, ._ss, .cmp, .dst0x, .src1x, .vp(switch (cc) { + .{ ._, ._ss, .cmp, .dst0x, .src1d, .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -17070,11 +26101,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, @@ -17093,18 +26125,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, .scalar = .dword }, } }}, .each = .{ .once = &.{ - .{ ._, ._ps, .cmp, .dst0x, .src1x, .vp(switch (cc) { + .{ ._, ._ps, .cmp, .dst0x, .src1x, .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -17115,11 +26148,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, @@ -17138,11 +26172,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, @@ -17150,7 +26185,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .info = .{ .kind = .all, .scalar = .qword }, } }}, .each = .{ .once = &.{ - .{ ._, .v_sd, .cmp, .dst0x, .src0x, .src1x, .vp(switch (cc) { + .{ ._, .v_sd, .cmp, .dst0x, .src0x, .src1q, .vp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -17161,18 +26196,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, .scalar = .qword }, } }}, .each = .{ .once = &.{ - .{ ._, ._sd, .cmp, .dst0x, .src1x, .vp(switch (cc) { + .{ ._, ._sd, .cmp, .dst0x, .src1q, .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -17183,11 +26219,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, @@ -17206,18 +26243,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .mem } }, - .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_sse, .to_sse } }, + .{ .src = .{ .to_mut_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .ref_mask = .{ .ref = .src0, .info = .{ .kind = .all, .scalar = .qword }, } }}, .each = .{ .once = &.{ - .{ ._, ._pd, .cmp, .dst0x, .src1x, .vp(switch (cc) { + .{ ._, ._pd, .cmp, .dst0x, .src1x, .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -17228,11 +26266,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .mut_rc_mask = .{ .ref = .src0, @@ -17251,15 +26290,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, @@ -17289,15 +26329,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, @@ -17327,21 +26368,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -17372,21 +26410,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -17417,21 +26452,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -17463,21 +26495,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -17509,21 +26538,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -17557,21 +26583,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -17605,9 +26628,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -17615,11 +26639,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -17659,9 +26679,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -17669,11 +26690,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -17713,9 +26730,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -17723,11 +26741,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -17768,9 +26782,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -17778,11 +26793,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -17823,9 +26834,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -17833,11 +26845,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -17880,9 +26888,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -17890,11 +26899,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqhf2", - .ne => "__nehf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmphf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -17937,9 +26942,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -17974,9 +26980,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18011,9 +27018,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18033,12 +27041,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .tmp3x, .memiad(.src0x, .tmp0, .add_size, 16), ._, ._ }, - .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .vp(switch (cc) { + .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, }), ._ }, - .{ ._, ._ps, .cmp, .tmp3x, .memiad(.src1x, .tmp0, .add_size, 16), .vp(switch (cc) { + .{ ._, ._ps, .cmp, .tmp3x, .memiad(.src1x, .tmp0, .add_size, 16), .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -18056,9 +27064,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18077,14 +27086,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .vp(switch (cc) { + .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, }), ._ }, .{ ._, ._ps, .movmsk, .tmp3d, .tmp2x, ._, ._ }, .{ ._, ._ps, .mova, .tmp2x, .memiad(.src0x, .tmp0, .add_size, 16), ._, ._ }, - .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, 16), .vp(switch (cc) { + .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, 16), .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -18102,9 +27111,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18124,7 +27134,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, .{ ._, ._mp, .j, .@"1f", ._, ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp2x, .memiad(.src0x, .tmp0, .add_size, -16), ._, ._ }, - .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, -16), .vp(switch (cc) { + .{ ._, ._ps, .cmp, .tmp2x, .memiad(.src1x, .tmp0, .add_size, -16), .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -18135,7 +27145,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .lea(.tmp1b), .tmp3b, ._, ._ }, .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 1), ._, ._ }, .{ .@"1:", ._ps, .mova, .tmp2x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .vp(switch (cc) { + .{ ._, ._ps, .cmp, .tmp2x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -18150,9 +27160,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18196,9 +27207,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18242,9 +27254,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18291,9 +27304,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18313,7 +27327,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, .{ .@"0:", ._pd, .mova, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, - .{ ._, ._pd, .cmp, .tmp3x, .memia(.src1x, .tmp0, .add_size), .vp(switch (cc) { + .{ ._, ._pd, .cmp, .tmp3x, .memia(.src1x, .tmp0, .add_size), .sp(switch (cc) { else => unreachable, .e => .eq, .ne => .neq, @@ -18340,9 +27354,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18350,8 +27365,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, }, @@ -18399,9 +27414,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18409,8 +27425,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, }, @@ -18458,17 +27474,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .reg = .rcx } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .u8, .kind = .{ .reg = .ah } }, .unused, .unused, @@ -18508,9 +27525,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18567,9 +27585,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18626,9 +27645,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -18676,10 +27696,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -18687,11 +27708,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -18721,10 +27738,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -18732,11 +27750,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -18766,10 +27780,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -18777,11 +27792,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -18811,10 +27822,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -18822,11 +27834,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -18856,10 +27864,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -18867,11 +27876,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -18901,10 +27906,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .dst_constraints = .{.{ .bool_vec = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -18912,11 +27918,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u32, .kind = .{ .reg = .edx } }, @@ -18946,9 +27948,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -18957,11 +27960,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -19000,9 +27999,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -19011,11 +28011,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -19054,9 +28050,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -19065,11 +28062,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -19108,9 +28101,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -19119,11 +28113,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -19162,9 +28152,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -19173,11 +28164,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -19216,9 +28203,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -19227,11 +28215,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (cc) { - else => unreachable, - .e => "__eqtf2", - .ne => "__netf2", - } } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__cmptf2" } } }, .{ .type = .i32, .kind = .{ .reg = .eax } }, .{ .type = .u8, .kind = .{ .reg = .cl } }, .{ .type = .u64, .kind = .{ .reg = .rdx } }, @@ -19266,31 +28250,1583 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .memsi(.dst0q, .@"8", .tmp1), .tmp2q, ._, ._ }, } }, } }, - }) catch |err| switch (err) { - error.SelectFailed => return cg.fail("failed to select {s} {s} {} {} {}", .{ - @tagName(air_tag), - @tagName(extra.compareOperator()), - cg.typeOf(extra.lhs).fmt(pt), - ops[0].tracking(cg), - ops[1].tracking(cg), - }), - else => |e| return e, - }, - .gte => unreachable, - .gt => unreachable, - } - try res[0].finish(inst, &.{ extra.lhs, extra.rhs }, &ops, cg); + }), + }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {s} {} {} {}", .{ + @tagName(air_tag), + @tagName(extra.compareOperator()), + cg.typeOf(extra.lhs).fmt(pt), + ops[0].tracking(cg), + ops[1].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{ extra.lhs, extra.rhs }, &ops, cg); + }, + + .sqrt => |air_tag| if (use_old) try cg.airSqrt(inst) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + var ops = try cg.tempsFromOperands(inst, .{un_op}); + var res: [1]Temp = undefined; + cg.select(&res, &.{cg.typeOf(un_op)}, &ops, comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ss, .sqrt, .dst0x, .dst0x, .dst0d, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrth" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .sqrt, .dst0x, .dst0x, ._, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .sqrt, .dst0y, .dst0y, ._, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .sqrt, .tmp1y, .tmp1y, ._, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrth" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrth" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrth" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrth" } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_ss, .sqrt, .dst0x, .dst0x, .src0d, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ss, .sqrt, .dst0x, .src0x, .src0d, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._ss, .sqrt, .dst0x, .src0d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ss, .sqrt, .dst0x, .src0d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrtf" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .sqrt, .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .sqrt, .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .sqrt, .dst0y, .src0y, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .sqrt, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .sqrt, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrtf" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrtf" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_sd, .sqrt, .dst0x, .dst0x, .src0q, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .sqrt, .dst0x, .src0x, .src0q, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .xor, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._sd, .sqrt, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._sd, .sqrt, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrt" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .sqrt, .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .sqrt, .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .sqrt, .dst0y, .src0y, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .sqrt, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .sqrt, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrt" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrt" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrt" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrtx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrtx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrtx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrtx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrtx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__sqrtx" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrtq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrtq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrtq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "sqrtq" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ + @tagName(air_tag), + cg.typeOf(un_op).fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{un_op}, &ops, cg); + }, + .sin, .cos, .tan, .exp, .exp2, .log, .log2, .log10, .round => |air_tag| if (use_old) try cg.airUnaryMath(inst, air_tag) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + var ops = try cg.tempsFromOperands(inst, .{un_op}); + var res: [1]Temp = undefined; + cg.select(&res, &.{cg.typeOf(un_op)}, &ops, switch (air_tag) { + else => unreachable, + inline .sin, .cos, .tan, .exp, .exp2, .log, .log2, .log10, .round => |name| comptime &.{ .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "h" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "h" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "h" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "h" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "h" } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) ++ "f" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) ++ "f" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) ++ "f" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "x" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "x" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "x" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "x" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "x" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__" ++ @tagName(name) ++ "x" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) ++ "q" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) ++ "q" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) ++ "q" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = @tagName(name) ++ "q" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }, + }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ + @tagName(air_tag), + cg.typeOf(un_op).fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{un_op}, &ops, cg); }, - .abs => |air_tag| if (use_old) try cg.airAbs(inst) else { const ty_op = air_datas[@intFromEnum(inst)].ty_op; var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); var res: [1]Temp = undefined; cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -19300,9 +29836,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._s, .cmov, .dst0d, .src0d, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19312,9 +29848,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .neg, .dst0b, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .byte }, .any }, + .src_constraints = .{ .{ .int = .byte }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19325,9 +29861,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -19338,9 +29874,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -19350,9 +29886,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._s, .cmov, .dst0d, .src0d, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19362,9 +29898,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .neg, .dst0d, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .word }, .any }, + .src_constraints = .{ .{ .int = .word }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19375,10 +29911,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -19388,9 +29924,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._s, .cmov, .dst0d, .src0d, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19400,9 +29936,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .neg, .dst0d, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .dword }, .any }, + .src_constraints = .{ .{ .int = .dword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19413,10 +29949,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .{ .int = .qword }, .any }, + .src_constraints = .{ .{ .int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -19427,9 +29963,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .qword }, .any }, + .src_constraints = .{ .{ .int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19440,9 +29976,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .qword }, .any }, + .src_constraints = .{ .{ .int = .qword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, @@ -19453,9 +29989,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_int, .any }, + .src_constraints = .{ .any_int, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19486,10 +30022,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, .ssse3, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_mm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_mm, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }}, .each = .{ .once = &.{ @@ -19497,10 +30033,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, .ssse3, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_mm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_mm, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }}, .each = .{ .once = &.{ @@ -19508,10 +30044,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, .ssse3, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_mm, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_mm, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .mmx } }}, .each = .{ .once = &.{ @@ -19519,10 +30055,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .ssse3, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19530,10 +30066,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .ssse3, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19541,10 +30077,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .ssse3, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19552,10 +30088,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19563,10 +30099,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19574,10 +30110,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19585,10 +30121,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19596,10 +30132,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19607,10 +30143,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ @@ -19618,9 +30154,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19644,9 +30180,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19670,9 +30206,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19696,9 +30232,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19722,9 +30258,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19748,9 +30284,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19774,9 +30310,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .ssse3, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19800,9 +30336,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .ssse3, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19826,9 +30362,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .ssse3, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19852,9 +30388,61 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .mmx, .ssse3, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .p_b, .abs, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .mmx, .ssse3, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .p_w, .abs, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .mmx, .ssse3, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -19870,21 +30458,498 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .p_b, .abs, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", .p_d, .abs, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, .slow_incdec, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .movsx, .tmp2d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ }, + .{ ._, ._s, .cmov, .tmp1d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .movsx, .tmp2d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ }, + .{ ._, ._s, .cmov, .tmp1d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, + .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .sub, .tmp1w, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._s, .cmov, .tmp1w, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .neg, .tmp1d, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .cmov, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .sub, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._s, .cmov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .neg, .tmp1d, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .cmov, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .sub, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._s, .cmov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, + .{ ._, ._, .@"test", .tmp1q, .tmp1q, ._, ._ }, + .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, + .{ ._, ._, .neg, .tmp1q, ._, ._, ._ }, + .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .mov, .tmp2q, .memiad(.src0q, .tmp0, .add_src0_elem_size, -8), ._, ._ }, + .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"1:", ._, .mov, .tmp4q, .memi(.src0q, .tmp0), ._, ._ }, + .{ ._, ._, .xor, .tmp4q, .tmp2q, ._, ._ }, + .{ ._, ._r, .sh, .tmp3b, .ui(1), ._, ._ }, + .{ ._, ._, .sbb, .tmp4q, .tmp2q, ._, ._ }, + .{ ._, ._c, .set, .tmp3b, ._, ._, ._ }, + .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ }, + .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 8), ._, ._ }, + .{ ._, ._, .sub, .tmp1d, .si(8), ._, ._ }, + .{ ._, ._a, .j, .@"1b", ._, ._, ._ }, + .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ }, + .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_pd, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._pd, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .x87 } }}, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_, .abs, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .mmx, .ssse3, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .rc = .sse } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -19893,24 +30958,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .p_w, .abs, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, } }, }, .{ - .required_features = .{ .mmx, .ssse3, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .dword } }, .any }, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .rc = .sse } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -19919,25 +30980,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .p_d, .abs, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._q, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, .slow_incdec, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .unused, .unused, .unused, .unused, @@ -19945,28 +31002,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .movsx, .tmp2d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ }, - .{ ._, ._s, .cmov, .tmp1d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .unused, .unused, .unused, .unused, @@ -19974,27 +31024,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .movsx, .tmp2d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .sub, .tmp1b, .tmp2b, ._, ._ }, - .{ ._, ._s, .cmov, .tmp1d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .unused, .unused, .unused, @@ -20003,28 +31046,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, - .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -20032,28 +31069,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .@"test", .tmp1b, .tmp1b, ._, ._ }, - .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0b, .tmp0, .add_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", .v_ps, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -20061,26 +31096,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .sub, .tmp1w, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._s, .cmov, .tmp1w, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -20088,28 +31124,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_pd, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .neg, .tmp1d, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", .v_pd, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .cmov, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -20117,26 +31151,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._pd, .mova, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .sub, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._s, .cmov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._pd, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -20144,28 +31179,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .@"test", .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .neg, .tmp1d, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0d, .tmp0, .add_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .cmov, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -20173,27 +31206,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .v_pd, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .sub, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._s, .cmov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ .@"0:", .v_pd, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -20201,63 +31233,1137 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_size), ._, ._ }, - .{ ._, ._, .@"test", .tmp1q, .tmp1q, ._, ._ }, - .{ ._, ._ns, .j, .@"1f", ._, ._, ._ }, - .{ ._, ._, .neg, .tmp1q, ._, ._, ._ }, - .{ .@"1:", ._, .mov, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, .p_, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .rc = .sse } }, + .{ .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .sa(.none, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .mov, .tmp2q, .memiad(.src0q, .tmp0, .add_src0_elem_size, -8), ._, ._ }, - .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ }, - .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, - .{ .@"1:", ._, .mov, .tmp4q, .memi(.src0q, .tmp0), ._, ._ }, - .{ ._, ._, .xor, .tmp4q, .tmp2q, ._, ._ }, - .{ ._, ._r, .sh, .tmp3b, .ui(1), ._, ._ }, - .{ ._, ._, .sbb, .tmp4q, .tmp2q, ._, ._ }, - .{ ._, ._c, .set, .tmp3b, ._, ._, ._ }, - .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp4q, ._, ._ }, - .{ ._, ._, .lea, .tmp0d, .lead(.tmp0, 8), ._, ._ }, - .{ ._, ._, .sub, .tmp1d, .si(8), ._, ._ }, - .{ ._, ._a, .j, .@"1b", ._, ._, ._ }, - .{ ._, ._, .cmp, .tmp0d, .sa(.src0, .add_unaligned_size), ._, ._ }, - .{ ._, ._b, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ + @tagName(air_tag), + cg.typeOf(ty_op.operand).fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .floor, .ceil, .trunc_float => |air_tag| if (use_old) try cg.airRound(inst, .{ .direction = switch (air_tag) { + else => unreachable, + .floor => .down, + .ceil => .up, + .trunc_float => .zero, + }, .precision = .inexact }) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + var ops = try cg.tempsFromOperands(inst, .{un_op}); + var res: [1]Temp = undefined; + cg.select(&res, &.{cg.typeOf(un_op)}, &ops, switch (@as(bits.RoundMode.Direction, switch (air_tag) { + else => unreachable, + .floor => .down, + .ceil => .up, + .trunc_float => .zero, + })) { + else => unreachable, + inline .down, .up, .zero => |direction| comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ss, .round, .dst0x, .dst0x, .dst0d, .rm(.{ .direction = direction, .precision = .inexact }) }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorh", + .up => "__ceilh", + .zero => "__trunch", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .round, .dst0x, .dst0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .round, .dst0y, .dst0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .round, .tmp1y, .tmp1y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorh", + .up => "__ceilh", + .zero => "__trunch", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorh", + .up => "__ceilh", + .zero => "__trunch", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorh", + .up => "__ceilh", + .zero => "__trunch", + } } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorh", + .up => "__ceilh", + .zero => "__trunch", + } } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_ss, .round, .dst0x, .dst0x, .src0d, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ss, .round, .dst0x, .src0x, .src0d, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._ss, .round, .dst0x, .src0d, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._ss, .round, .dst0x, .src0d, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floorf", + .up => "ceilf", + .zero => "truncf", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .round, .dst0x, .src0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .round, .dst0x, .src0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .round, .dst0y, .src0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .round, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), .rm(.{ + .direction = direction, + .precision = .inexact, + }), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .round, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), .rm(.{ + .direction = direction, + .precision = .inexact, + }), ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floorf", + .up => "ceilf", + .zero => "truncf", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floorf", + .up => "ceilf", + .zero => "truncf", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_sd, .round, .dst0x, .dst0x, .src0q, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .round, .dst0x, .src0x, .src0q, .rm(.{ .direction = direction, .precision = .inexact }) }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .xor, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._sd, .round, .dst0x, .src0q, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, ._sd, .round, .dst0x, .src0q, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floor", + .up => "ceil", + .zero => "trunc", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .round, .dst0x, .src0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .round, .dst0x, .src0x, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .round, .dst0y, .src0y, .rm(.{ .direction = direction, .precision = .inexact }), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .round, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), .rm(.{ + .direction = direction, + .precision = .inexact, + }), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .round, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), .rm(.{ + .direction = direction, + .precision = .inexact, + }), ._ }, + .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floor", + .up => "ceil", + .zero => "trunc", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floor", + .up => "ceil", + .zero => "trunc", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floor", + .up => "ceil", + .zero => "trunc", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorx", + .up => "__ceilx", + .zero => "__truncx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorx", + .up => "__ceilx", + .zero => "__truncx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorx", + .up => "__ceilx", + .zero => "__truncx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorx", + .up => "__ceilx", + .zero => "__truncx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorx", + .up => "__ceilx", + .zero => "__truncx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "__floorx", + .up => "__ceilx", + .zero => "__truncx", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floorq", + .up => "ceilq", + .zero => "truncq", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floorq", + .up => "ceilq", + .zero => "truncq", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floorq", + .up => "ceilq", + .zero => "truncq", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = switch (direction) { + else => unreachable, + .down => "floorq", + .up => "ceilq", + .zero => "truncq", + } } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, } }, - }, .{ + }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ + @tagName(air_tag), + cg.typeOf(un_op).fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{un_op}, &ops, cg); + }, + .neg, .neg_optimized => |air_tag| if (use_old) try cg.airFloatSign(inst, .neg) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + var ops = try cg.tempsFromOperands(inst, .{un_op}); + var res: [1]Temp = undefined; + cg.select(&res, &.{cg.typeOf(un_op)}, &ops, comptime &.{ .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -20269,17 +32375,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .v_ps, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + .{ ._, .v_ps, .xor, .dst0x, .src0x, .lea(.tmp0x), ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -20291,17 +32397,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._ps, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .unused, .unused, .unused, @@ -20313,17 +32419,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .v_ps, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, .v_ps, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -20335,17 +32441,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .v_pd, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + .{ ._, .v_pd, .xor, .dst0x, .src0x, .lea(.tmp0x), ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -20357,17 +32463,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._pd, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._pd, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .unused, .unused, .unused, @@ -20379,14 +32485,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_x87, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st7 } }, @@ -20402,18 +32508,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .x87 } }}, .each = .{ .once = &.{ .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, - .{ ._, .f_, .abs, ._, ._, ._, ._ }, + .{ ._, .f_, .chs, ._, ._, ._, ._ }, .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_any_float = .xword }, .any }, + .src_constraints = .{ .{ .scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -20425,17 +32531,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + .{ ._, .vp_, .xor, .dst0x, .src0x, .lea(.tmp0x), ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_any_float = .xword }, .any }, + .src_constraints = .{ .{ .scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -20447,17 +32553,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_any_float = .xword }, .any }, + .src_constraints = .{ .{ .scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .unused, .unused, .unused, @@ -20469,17 +32575,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._ps, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_any_float = .yword }, .any }, + .src_constraints = .{ .{ .scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .unused, .unused, .unused, @@ -20491,17 +32597,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, .vp_, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_any_float = .yword }, .any }, + .src_constraints = .{ .{ .scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .unused, .unused, .unused, @@ -20513,17 +32619,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .v_pd, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, .v_pd, .xor, .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20537,20 +32643,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_ps, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_ps, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ .@"0:", .v_ps, .xor, .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20565,20 +32671,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .mova, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._ps, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .xor, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20592,20 +32698,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_pd, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_pd, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ .@"0:", .v_pd, .xor, .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20620,20 +32726,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._pd, .mova, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._pd, .mova, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._pd, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._pd, .xor, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20647,20 +32753,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ .@"0:", .vp_, .xor, .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .yword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .yword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20674,20 +32780,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, .{ ._, .v_pd, .mova, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, - .{ .@"0:", .v_pd, .@"and", .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, + .{ .@"0:", .v_pd, .xor, .tmp3y, .tmp2y, .memia(.src0y, .tmp0, .add_size), ._ }, .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp3y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20702,20 +32808,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._dqa, .mov, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, .p_, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, .p_, .xor, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any }, + .src_constraints = .{ .{ .multiple_scalar_any_float = .xword }, .any, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .smax_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } }, .{ .kind = .{ .rc = .sse } }, .{ .kind = .{ .rc = .sse } }, .unused, @@ -20730,7 +32836,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._ps, .mova, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._ps, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, + .{ ._, ._ps, .xor, .tmp3x, .memia(.src0x, .tmp0, .add_size), ._, ._ }, .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, @@ -20738,12 +32844,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }) catch |err| switch (err) { error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{ @tagName(air_tag), - cg.typeOf(ty_op.operand).fmt(pt), + cg.typeOf(un_op).fmt(pt), ops[0].tracking(cg), }), else => |e| return e, }; - try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); + try res[0].finish(inst, &.{un_op}, &ops, cg); }, .cmp_lt, @@ -20772,9 +32878,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }) { inline false, true => |strict| comptime &.{ .{ .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .float = .word }, .{ .float = .word } }, + .src_constraints = .{ .{ .float = .word }, .{ .float = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ .{ .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } }, @@ -20799,9 +32905,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .float = .word }, .{ .float = .word } }, + .src_constraints = .{ .{ .float = .word }, .{ .float = .word }, .any }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -20826,10 +32932,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword } }, + .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = switch (strict) { true => .a, @@ -20841,10 +32947,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword } }, + .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = switch (strict) { true => .a, @@ -20856,10 +32962,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = switch (strict) { true => .a, @@ -20871,10 +32977,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = switch (strict) { true => .a, @@ -20886,13 +32992,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, .cmov, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -20914,13 +33020,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .u8, .kind = .{ .reg = .ah } }, .unused, .unused, @@ -20943,13 +33049,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .u8, .kind = .{ .reg = .ah } }, .unused, .unused, @@ -20975,10 +33081,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, .cmov, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_x87, .to_x87 }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_x87, .to_x87, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st7 } }, @@ -21002,9 +33108,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21031,10 +33137,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_x87, .to_x87 }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_x87, .to_x87, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21060,9 +33166,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21092,10 +33198,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_x87, .to_x87 }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_x87, .to_x87, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21124,9 +33230,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .float = .xword }, .{ .float = .xword } }, + .src_constraints = .{ .{ .float = .xword }, .{ .float = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -21204,15 +33310,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { switch (Condition.fromCompareOperatorUnsigned(cmp_op)) { else => unreachable, inline .e, .ne => |cc| comptime &.{.{ - .src_constraints = .{ .{ .size = .byte }, .{ .size = .byte } }, + .src_constraints = .{ .{ .size = .byte }, .{ .size = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm8 } }, - .{ .src = .{ .imm8, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .imm8 } }, - .{ .src = .{ .imm8, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr } }, - .{ .src = .{ .to_gpr, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm8, .none } }, + .{ .src = .{ .imm8, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none } }, + .{ .src = .{ .to_gpr, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, @@ -21254,9 +33360,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }) { inline false, true => |optimized| comptime &.{ .{ .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .float = .word }, .{ .float = .word } }, + .src_constraints = .{ .{ .float = .word }, .{ .float = .word }, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .extra_temps = .{ .{ .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } }, @@ -21277,13 +33383,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, .v_ps, .cvtph2, .tmp0x, .src0q, ._, ._ }, .{ ._, .v_ps, .cvtph2, .tmp1x, .src1q, ._, ._ }, - .{ ._, .v_ss, .ucomi, .tmp0x, .tmp1x, ._, ._ }, + .{ ._, .v_ss, .ucomi, .tmp0x, .tmp1d, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .float = .word }, .{ .float = .word } }, + .src_constraints = .{ .{ .float = .word }, .{ .float = .word }, .any }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -21305,11 +33411,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword } }, + .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .cc = switch (optimized) { false => .z_and_np, @@ -21321,11 +33427,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword } }, + .src_constraints = .{ .{ .float = .dword }, .{ .float = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .cc = switch (optimized) { false => .z_and_np, @@ -21337,11 +33443,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .cc = switch (optimized) { false => .z_and_np, @@ -21353,11 +33459,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_sse, .mem } }, - .{ .src = .{ .mem, .to_sse }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .mem, .none } }, + .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .none } }, }, .dst_temps = .{.{ .cc = switch (optimized) { false => .z_and_np, @@ -21369,13 +33475,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, .cmov, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -21397,13 +33503,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mem, .to_mem, .none }, .commute = .{ 0, 1 } }, }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .u8, .kind = .{ .reg = .ah } }, .unused, .unused, @@ -21426,13 +33532,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword } }, + .src_constraints = .{ .{ .float = .qword }, .{ .float = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st6 } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .f64, .kind = .{ .reg = .st6 } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, .{ .type = .u8, .kind = .{ .reg = .ah } }, .unused, .unused, @@ -21465,11 +33571,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, .cmov, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st7 } }, @@ -21493,9 +33599,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21522,11 +33628,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sahf, .x87, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21552,9 +33658,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .mem } }, + .{ .src = .{ .mem, .mem, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21591,11 +33697,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte } }, + .src_constraints = .{ .{ .float = .tbyte }, .{ .float = .tbyte }, .any }, .patterns = &.{ - .{ .src = .{ .to_x87, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_x87 } }, - .{ .src = .{ .to_x87, .to_x87 } }, + .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_x87, .none } }, + .{ .src = .{ .to_x87, .to_x87, .none } }, }, .extra_temps = .{ .{ .type = .f80, .kind = .{ .reg = .st6 } }, @@ -21630,9 +33736,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .float = .xword }, .{ .float = .xword } }, + .src_constraints = .{ .{ .float = .xword }, .{ .float = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 } } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ @@ -21663,278 +33769,1020 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, } }, - .int => res[0] = ops[0].cmpInts(cmp_op, &ops[1], cg) catch |err| break :err err, - }) 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, - }; - if (opt_info) |*oi| { - for (ops) |op| for (res) |r| { - if (op.index == r.index) break; - } else try op.die(cg); - try cg.genCopy(.bool, oi.res[0].tracking(cg).short, res[0].tracking(cg).short, .{}); - try res[0].die(cg); - res[0] = oi.res[0]; - try cg.restoreState(oi.state, &oi.deaths, .{ - .emit_instructions = true, - .update_tracking = true, - .resurrect = true, - .close_scope = true, - }); - cg.performReloc(oi.reloc); - @memset(&ops, res[0]); - } - try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); - }, - - .cond_br => try cg.airCondBr(inst), - .switch_br => try cg.airSwitchBr(inst), - .loop_switch_br => try cg.airLoopSwitchBr(inst), - .switch_dispatch => try cg.airSwitchDispatch(inst), - .@"try", .try_cold => try cg.airTry(inst), - .try_ptr, .try_ptr_cold => try cg.airTryPtr(inst), - .dbg_stmt => if (cg.debug_output != .none) { - const dbg_stmt = air_datas[@intFromEnum(inst)].dbg_stmt; - _ = try cg.addInst(.{ - .tag = .pseudo, - .ops = .pseudo_dbg_line_stmt_line_column, - .data = .{ .line_column = .{ - .line = dbg_stmt.line, - .column = dbg_stmt.column, + .int => res[0] = ops[0].cmpInts(cmp_op, &ops[1], cg) catch |err| break :err err, + }) 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, + }; + if (opt_info) |*oi| { + for (ops) |op| for (res) |r| { + if (op.index == r.index) break; + } else try op.die(cg); + try cg.genCopy(.bool, oi.res[0].tracking(cg).short, res[0].tracking(cg).short, .{}); + try res[0].die(cg); + res[0] = oi.res[0]; + try cg.restoreState(oi.state, &oi.deaths, .{ + .emit_instructions = true, + .update_tracking = true, + .resurrect = true, + .close_scope = true, + }); + cg.performReloc(oi.reloc); + @memset(&ops, res[0]); + } + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + + .cond_br => try cg.airCondBr(inst), + .switch_br => try cg.airSwitchBr(inst), + .loop_switch_br => try cg.airLoopSwitchBr(inst), + .switch_dispatch => try cg.airSwitchDispatch(inst), + .@"try", .try_cold => try cg.airTry(inst), + .try_ptr, .try_ptr_cold => try cg.airTryPtr(inst), + .dbg_stmt => if (cg.debug_output != .none) { + const dbg_stmt = air_datas[@intFromEnum(inst)].dbg_stmt; + _ = try cg.addInst(.{ + .tag = .pseudo, + .ops = .pseudo_dbg_line_stmt_line_column, + .data = .{ .line_column = .{ + .line = dbg_stmt.line, + .column = dbg_stmt.column, + } }, + }); + }, + .dbg_empty_stmt => if (cg.debug_output != .none) { + if (cg.mir_instructions.len > 0) { + const prev_mir_op = &cg.mir_instructions.items(.ops)[cg.mir_instructions.len - 1]; + if (prev_mir_op.* == .pseudo_dbg_line_line_column) + prev_mir_op.* = .pseudo_dbg_line_stmt_line_column; + } + try cg.asmOpOnly(.{ ._, .nop }); + }, + .dbg_inline_block => { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const extra = cg.air.extraData(Air.DbgInlineBlock, ty_pl.payload); + const old_inline_func = cg.inline_func; + defer cg.inline_func = old_inline_func; + cg.inline_func = extra.data.func; + if (cg.debug_output != .none) _ = try cg.addInst(.{ + .tag = .pseudo, + .ops = .pseudo_dbg_enter_inline_func, + .data = .{ .func = extra.data.func }, + }); + try cg.lowerBlock(inst, @ptrCast(cg.air.extra[extra.end..][0..extra.data.body_len])); + if (cg.debug_output != .none) _ = try cg.addInst(.{ + .tag = .pseudo, + .ops = .pseudo_dbg_leave_inline_func, + .data = .{ .func = old_inline_func }, + }); + }, + .dbg_var_ptr, + .dbg_var_val, + .dbg_arg_inline, + => if (use_old) try cg.airDbgVar(inst) else if (cg.debug_output != .none) { + const pl_op = air_datas[@intFromEnum(inst)].pl_op; + var ops = try cg.tempsFromOperands(inst, .{pl_op.operand}); + var mcv = ops[0].tracking(cg).short; + switch (mcv) { + else => {}, + .eflags => |cc| switch (cc) { + else => {}, + // These values would self destruct. Maybe we make them use their + // turing complete dwarf expression interpreters for once? + .z_and_np, .nz_or_p => { + try cg.spillEflagsIfOccupied(); + mcv = ops[0].tracking(cg).short; + }, + }, + } + try cg.genLocalDebugInfo(inst, ops[0].tracking(cg).short); + try ops[0].die(cg); + }, + .is_null_ptr => if (use_old) try cg.airIsNullPtr(inst) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + const opt_ty = cg.typeOf(un_op).childType(zcu); + const opt_repr_is_pl = opt_ty.optionalReprIsPayload(zcu); + const opt_child_ty = opt_ty.optionalChild(zcu); + const opt_child_abi_size: u31 = @intCast(opt_child_ty.abiSize(zcu)); + var ops = try cg.tempsFromOperands(inst, .{un_op}); + if (!opt_repr_is_pl) try ops[0].toOffset(opt_child_abi_size, cg); + while (try ops[0].toLea(cg)) {} + try cg.asmMemoryImmediate( + .{ ._, .cmp }, + try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = if (!opt_repr_is_pl) + .byte + else if (opt_child_ty.isSlice(zcu)) + .qword + else + .fromSize(opt_child_abi_size) }), + .u(0), + ); + const is_null = try cg.tempInit(.bool, .{ .eflags = .e }); + try is_null.finish(inst, &.{un_op}, &ops, cg); + }, + .is_non_null_ptr => if (use_old) try cg.airIsNonNullPtr(inst) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + const opt_ty = cg.typeOf(un_op).childType(zcu); + const opt_repr_is_pl = opt_ty.optionalReprIsPayload(zcu); + const opt_child_ty = opt_ty.optionalChild(zcu); + const opt_child_abi_size: u31 = @intCast(opt_child_ty.abiSize(zcu)); + var ops = try cg.tempsFromOperands(inst, .{un_op}); + if (!opt_repr_is_pl) try ops[0].toOffset(opt_child_abi_size, cg); + while (try ops[0].toLea(cg)) {} + try cg.asmMemoryImmediate( + .{ ._, .cmp }, + try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = if (!opt_repr_is_pl) + .byte + else if (opt_child_ty.isSlice(zcu)) + .qword + else + .fromSize(opt_child_abi_size) }), + .u(0), + ); + const is_non_null = try cg.tempInit(.bool, .{ .eflags = .ne }); + try is_non_null.finish(inst, &.{un_op}, &ops, cg); + }, + .is_err_ptr => if (use_old) try cg.airIsErrPtr(inst) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + const eu_ty = cg.typeOf(un_op).childType(zcu); + const eu_err_ty = eu_ty.errorUnionSet(zcu); + const eu_pl_ty = eu_ty.errorUnionPayload(zcu); + const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); + var ops = try cg.tempsFromOperands(inst, .{un_op}); + try ops[0].toOffset(eu_err_off, cg); + while (try ops[0].toLea(cg)) {} + try cg.asmMemoryImmediate( + .{ ._, .cmp }, + try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }), + .u(0), + ); + const is_err = try cg.tempInit(.bool, .{ .eflags = .ne }); + try is_err.finish(inst, &.{un_op}, &ops, cg); + }, + .is_non_err_ptr => if (use_old) try cg.airIsNonErrPtr(inst) else { + const un_op = air_datas[@intFromEnum(inst)].un_op; + const eu_ty = cg.typeOf(un_op).childType(zcu); + const eu_err_ty = eu_ty.errorUnionSet(zcu); + const eu_pl_ty = eu_ty.errorUnionPayload(zcu); + const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); + var ops = try cg.tempsFromOperands(inst, .{un_op}); + try ops[0].toOffset(eu_err_off, cg); + while (try ops[0].toLea(cg)) {} + try cg.asmMemoryImmediate( + .{ ._, .cmp }, + try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }), + .u(0), + ); + const is_non_err = try cg.tempInit(.bool, .{ .eflags = .e }); + try is_non_err.finish(inst, &.{un_op}, &ops, cg); + }, + .load => if (use_old) try cg.airLoad(inst) else fallback: { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const val_ty = ty_op.ty.toType(); + const ptr_ty = cg.typeOf(ty_op.operand); + const ptr_info = ptr_ty.ptrInfo(zcu); + if (ptr_info.packed_offset.host_size > 0 and + (ptr_info.flags.vector_index == .none or val_ty.toIntern() == .bool_type)) + break :fallback try cg.airLoad(inst); + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + const res = try ops[0].load(val_ty, .{ + .disp = switch (ptr_info.flags.vector_index) { + .none => 0, + .runtime => unreachable, + else => |vector_index| @intCast(val_ty.abiSize(zcu) * @intFromEnum(vector_index)), + }, + }, cg); + try res.finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .ret => try cg.airRet(inst, false), + .ret_safe => try cg.airRet(inst, true), + .ret_load => try cg.airRetLoad(inst), + .store, .store_safe => |air_tag| if (use_old) try cg.airStore(inst, switch (air_tag) { + else => unreachable, + .store => false, + .store_safe => true, + }) else fallback: { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + const ptr_ty = cg.typeOf(bin_op.lhs); + const ptr_info = ptr_ty.ptrInfo(zcu); + const val_ty = cg.typeOf(bin_op.rhs); + if (ptr_info.packed_offset.host_size > 0 and + (ptr_info.flags.vector_index == .none or val_ty.toIntern() == .bool_type)) + break :fallback try cg.airStore(inst, switch (air_tag) { + else => unreachable, + .store => false, + .store_safe => true, + }); + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + try ops[0].store(&ops[1], .{ + .disp = switch (ptr_info.flags.vector_index) { + .none => 0, + .runtime => unreachable, + else => |vector_index| @intCast(val_ty.abiSize(zcu) * @intFromEnum(vector_index)), + }, + .safe = switch (air_tag) { + else => unreachable, + .store => false, + .store_safe => true, + }, + }, cg); + for (ops) |op| try op.die(cg); + }, + .unreach => {}, + .fptrunc => |air_tag| if (use_old) try cg.airFptrunc(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + var res: [1]Temp = undefined; + cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_, .cvtps2ph, .dst0q, .src0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_, .cvtps2ph, .dst0q, .src0x, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_, .cvtps2ph, .dst0x, .src0y, .rm(.{}), ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memsia(.src0y, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_ss, .cvtsd2, .dst0x, .dst0x, .src0q, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ss, .cvtsd2, .dst0x, .src0x, .src0q, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._ss, .cvtsd2, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0d, ._, ._, ._ }, } }, - }); - }, - .dbg_empty_stmt => if (cg.debug_output != .none) { - if (cg.mir_instructions.len > 0) { - const prev_mir_op = &cg.mir_instructions.items(.ops)[cg.mir_instructions.len - 1]; - if (prev_mir_op.* == .pseudo_dbg_line_line_column) - prev_mir_op.* = .pseudo_dbg_line_stmt_line_column; - } - try cg.asmOpOnly(.{ ._, .nop }); - }, - .dbg_inline_block => { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const extra = cg.air.extraData(Air.DbgInlineBlock, ty_pl.payload); - const old_inline_func = cg.inline_func; - defer cg.inline_func = old_inline_func; - cg.inline_func = extra.data.func; - if (cg.debug_output != .none) _ = try cg.addInst(.{ - .tag = .pseudo, - .ops = .pseudo_dbg_enter_inline_func, - .data = .{ .func = extra.data.func }, - }); - try cg.lowerBlock(inst, @ptrCast(cg.air.extra[extra.end..][0..extra.data.body_len])); - if (cg.debug_output != .none) _ = try cg.addInst(.{ - .tag = .pseudo, - .ops = .pseudo_dbg_leave_inline_func, - .data = .{ .func = old_inline_func }, - }); - }, - .dbg_var_ptr, - .dbg_var_val, - .dbg_arg_inline, - => if (use_old) try cg.airDbgVar(inst) else if (cg.debug_output != .none) { - const pl_op = air_datas[@intFromEnum(inst)].pl_op; - var ops = try cg.tempsFromOperands(inst, .{pl_op.operand}); - var mcv = ops[0].tracking(cg).short; - switch (mcv) { - else => {}, - .eflags => |cc| switch (cc) { - else => {}, - // These values would self destruct. Maybe we make them use their - // turing complete dwarf expression interpreters for once? - .z_and_np, .nz_or_p => { - try cg.spillEflagsIfOccupied(); - mcv = ops[0].tracking(cg).short; - }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - } - try cg.genLocalDebugInfo(inst, ops[0].tracking(cg).short); - try ops[0].die(cg); - }, - .is_null_ptr => if (use_old) try cg.airIsNullPtr(inst) else { - const un_op = air_datas[@intFromEnum(inst)].un_op; - const opt_ty = cg.typeOf(un_op).childType(zcu); - const opt_repr_is_pl = opt_ty.optionalReprIsPayload(zcu); - const opt_child_ty = opt_ty.optionalChild(zcu); - const opt_child_abi_size: u31 = @intCast(opt_child_ty.abiSize(zcu)); - var ops = try cg.tempsFromOperands(inst, .{un_op}); - if (!opt_repr_is_pl) try ops[0].toOffset(opt_child_abi_size, cg); - while (try ops[0].toLea(cg)) {} - try cg.asmMemoryImmediate( - .{ ._, .cmp }, - try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = if (!opt_repr_is_pl) - .byte - else if (opt_child_ty.isSlice(zcu)) - .qword - else - .fromSize(opt_child_abi_size) }), - .u(0), - ); - const is_null = try cg.tempInit(.bool, .{ .eflags = .e }); - try is_null.finish(inst, &.{un_op}, &ops, cg); - }, - .is_non_null_ptr => if (use_old) try cg.airIsNonNullPtr(inst) else { - const un_op = air_datas[@intFromEnum(inst)].un_op; - const opt_ty = cg.typeOf(un_op).childType(zcu); - const opt_repr_is_pl = opt_ty.optionalReprIsPayload(zcu); - const opt_child_ty = opt_ty.optionalChild(zcu); - const opt_child_abi_size: u31 = @intCast(opt_child_ty.abiSize(zcu)); - var ops = try cg.tempsFromOperands(inst, .{un_op}); - if (!opt_repr_is_pl) try ops[0].toOffset(opt_child_abi_size, cg); - while (try ops[0].toLea(cg)) {} - try cg.asmMemoryImmediate( - .{ ._, .cmp }, - try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = if (!opt_repr_is_pl) - .byte - else if (opt_child_ty.isSlice(zcu)) - .qword - else - .fromSize(opt_child_abi_size) }), - .u(0), - ); - const is_non_null = try cg.tempInit(.bool, .{ .eflags = .ne }); - try is_non_null.finish(inst, &.{un_op}, &ops, cg); - }, - .is_err_ptr => if (use_old) try cg.airIsErrPtr(inst) else { - const un_op = air_datas[@intFromEnum(inst)].un_op; - const eu_ty = cg.typeOf(un_op).childType(zcu); - const eu_err_ty = eu_ty.errorUnionSet(zcu); - const eu_pl_ty = eu_ty.errorUnionPayload(zcu); - const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); - var ops = try cg.tempsFromOperands(inst, .{un_op}); - try ops[0].toOffset(eu_err_off, cg); - while (try ops[0].toLea(cg)) {} - try cg.asmMemoryImmediate( - .{ ._, .cmp }, - try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }), - .u(0), - ); - const is_err = try cg.tempInit(.bool, .{ .eflags = .ne }); - try is_err.finish(inst, &.{un_op}, &ops, cg); - }, - .is_non_err_ptr => if (use_old) try cg.airIsNonErrPtr(inst) else { - const un_op = air_datas[@intFromEnum(inst)].un_op; - const eu_ty = cg.typeOf(un_op).childType(zcu); - const eu_err_ty = eu_ty.errorUnionSet(zcu); - const eu_pl_ty = eu_ty.errorUnionPayload(zcu); - const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); - var ops = try cg.tempsFromOperands(inst, .{un_op}); - try ops[0].toOffset(eu_err_off, cg); - while (try ops[0].toLea(cg)) {} - try cg.asmMemoryImmediate( - .{ ._, .cmp }, - try ops[0].tracking(cg).short.deref().mem(cg, .{ .size = cg.memSize(eu_err_ty) }), - .u(0), - ); - const is_non_err = try cg.tempInit(.bool, .{ .eflags = .e }); - try is_non_err.finish(inst, &.{un_op}, &ops, cg); - }, - .load => if (use_old) try cg.airLoad(inst) else fallback: { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const val_ty = ty_op.ty.toType(); - const ptr_ty = cg.typeOf(ty_op.operand); - const ptr_info = ptr_ty.ptrInfo(zcu); - if (ptr_info.packed_offset.host_size > 0 and - (ptr_info.flags.vector_index == .none or val_ty.toIntern() == .bool_type)) - break :fallback try cg.airLoad(inst); - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - const res = try ops[0].load(val_ty, .{ - .disp = switch (ptr_info.flags.vector_index) { - .none => 0, - .runtime => unreachable, - else => |vector_index| @intCast(val_ty.abiSize(zcu) * @intFromEnum(vector_index)), + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtpd2, .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - }, cg); - try res.finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .ret => try cg.airRet(inst, false), - .ret_safe => try cg.airRet(inst, true), - .ret_load => try cg.airRetLoad(inst), - .store, .store_safe => |air_tag| if (use_old) try cg.airStore(inst, switch (air_tag) { - else => unreachable, - .store => false, - .store_safe => true, - }) else fallback: { - const bin_op = air_datas[@intFromEnum(inst)].bin_op; - const ptr_ty = cg.typeOf(bin_op.lhs); - const ptr_info = ptr_ty.ptrInfo(zcu); - const val_ty = cg.typeOf(bin_op.rhs); - if (ptr_info.packed_offset.host_size > 0 and - (ptr_info.flags.vector_index == .none or val_ty.toIntern() == .bool_type)) - break :fallback try cg.airStore(inst, switch (air_tag) { - else => unreachable, - .store => false, - .store_safe => true, - }); - var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); - try ops[0].store(&ops[1], .{ - .disp = switch (ptr_info.flags.vector_index) { - .none => 0, - .runtime => unreachable, - else => |vector_index| @intCast(val_ty.abiSize(zcu) * @intFromEnum(vector_index)), + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._ps, .cvtpd2, .dst0x, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .safe = switch (air_tag) { - else => unreachable, - .store => false, - .store_safe => true, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtpd2, .dst0x, .src0y, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, }, - }, cg); - for (ops) |op| try op.die(cg); - }, - .unreach => {}, - .fptrunc => |air_tag| if (use_old) try cg.airFptrunc(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - var res: [1]Temp = undefined; - cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtpd2, .tmp1x, .memsia(.src0y, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_2_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .cvtpd2, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .xmm0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_, .cvtps2ph, .dst0q, .src0x, .rm(.{}), ._ }, + .{ ._, .v_dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .xmm0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .xmm0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .dst0x, .mem(.src0x), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp0x), .dst0x, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp4d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .word } }}, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, .v_, .cvtps2ph, .dst0q, .src0x, .rm(.{}), ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .word } }}, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .v_, .cvtps2ph, .dst0x, .src0y, .rm(.{}), ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_x87, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -21944,21 +34792,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }}, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .f80, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -21971,23 +34819,47 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_ps, .mova, .tmp1y, .memsia(.src0y, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, .unused, .unused, .unused, @@ -21999,7 +34871,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, @@ -22007,16 +34879,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, .unused, .unused, .unused, @@ -22028,7 +34900,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, @@ -22036,16 +34908,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, .{ .type = .f16, .kind = .{ .reg = .ax } }, .unused, .unused, @@ -22057,7 +34929,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, @@ -22066,16 +34938,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncsfhf2" } } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, .{ .type = .f32, .kind = .mem }, .{ .type = .f16, .kind = .{ .reg = .ax } }, .unused, @@ -22087,7 +34959,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ss, .mov, .tmp1x, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, @@ -22097,14 +34969,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, .unused, .unused, .unused, @@ -22121,16 +34993,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, .unused, .unused, .unused, @@ -22142,24 +35014,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, .unused, .unused, .unused, @@ -22171,25 +35043,107 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .unused, .unused, .unused, .unused, @@ -22200,27 +35154,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._sd, .mov, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncdfhf2" } } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .unused, + .unused, .unused, .unused, .unused, @@ -22230,60 +35183,186 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .movl, .tmp1x, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, - .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_ps, .xor, .dst0x, .dst0x, .dst0x, ._ }, - .{ ._, .v_ss, .cvtsd2, .dst0x, .dst0x, .src0q, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_ss, .cvtsd2, .dst0x, .src0x, .src0q, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ + @tagName(air_tag), + ty_op.ty.toType().fmt(pt), + cg.typeOf(ty_op.operand).fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .fpext => |air_tag| if (use_old) try cg.airFpext(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + var res: [1]Temp = undefined; + cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ }, - .{ ._, ._ss, .cvtsd2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .yword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, .unused, .unused, .unused, @@ -22293,57 +35372,178 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, .f_p, .st, .dst0d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .mova, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .dword } }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtpd2, .dst0x, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_sd, .cvtss2, .dst0x, .dst0x, .dst0d, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .dword } }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._ps, .cvtpd2, .dst0x, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .dst0x, .dst0q, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .dword } }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtpd2, .dst0x, .src0y, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .dst0y, .dst0x, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .zword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -22353,24 +35553,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_ps, .cvtpd2, .tmp1x, .memsia(.src0y, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src0x, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp1y, .tmp0x, ._, ._ }, + .{ ._, .v_f128, .extract, .tmp0x, .tmp0y, .ui(1), ._ }, + .{ ._, .v_pd, .mova, .mem(.dst0y), .tmp1y, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp1y, .tmp0x, ._, ._ }, + .{ ._, .v_pd, .mova, .memd(.dst0y, 32), .tmp1y, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_f32, .kind = .{ .rc = .sse } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, + .unused, .unused, .unused, .unused, @@ -22379,26 +35580,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .cvtpd2, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .f16c, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, + .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -22409,24 +35606,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp2y, .tmp1x, ._, ._ }, + .{ ._, .v_f128, .extract, .tmp1x, .tmp1y, .ui(1), ._ }, + .{ ._, .v_pd, .mova, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp2y, ._, ._ }, + .{ ._, .v_pd, .cvtps2, .tmp2y, .tmp1x, ._, ._ }, + .{ ._, .v_pd, .mova, .memsiad(.dst0y, .@"4", .tmp0, .add_unaligned_size, 32), .tmp2y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, .unused, .unused, .unused, @@ -22434,25 +35635,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .reg = .xmm0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .v_dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, - .{ ._, .v_dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, - .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, .unused, .unused, .unused, @@ -22460,25 +35665,59 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .reg = .xmm0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, - .{ ._, ._dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, - .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, + .unused, + .unused, + .unused, .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .f16c, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f32, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -22486,56 +35725,50 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .reg = .xmm0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .rc = .x87 }}, .each = .{ .once = &.{ - .{ ._, ._ps, .mova, .dst0x, .mem(.src0x), ._, ._ }, - .{ ._, ._ps, .mova, .mem(.tmp0x), .dst0x, ._, ._ }, - .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src0q, ._, ._ }, + .{ ._, .v_ss, .mov, .mem(.tmp1d), .tmp0x, ._, ._ }, + .{ ._, .f_, .ld, .mem(.tmp1d), ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .reg = .st0 }}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .unused, .unused, .unused, .unused, @@ -22545,28 +35778,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .unused, + .unused, .unused, .unused, .unused, @@ -22575,29 +35809,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__truncxfhf2" } } }, .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, .unused, .unused, .unused, @@ -22606,26 +35840,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp1x, ._, ._ }, - .{ ._, ._, .mov, .tmp4d, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_x87, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, .unused, .unused, .unused, @@ -22635,22 +35869,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, - .{ ._, .f_p, .st, .dst0d, ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, .unused, .unused, .unused, @@ -22659,26 +35894,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .memia(.dst0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_x87, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, .unused, .unused, .unused, @@ -22687,47 +35924,92 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0t, ._, ._, ._ }, - .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memsia(.src0t, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .xor, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, .v_sd, .cvtss2, .dst0x, .dst0x, .src0d, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .cvtss2, .dst0x, .src0x, .src0d, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .sse }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .xor, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._sd, .cvtss2, .dst0x, .src0d, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .{ .type = .f32, .kind = .{ .reg = .st7 } }, .unused, .unused, .unused, @@ -22737,23 +36019,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, .f_, .ld, .src0d, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .cvtps2, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, ._pd, .cvtps2, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .yword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .cvtps2, .dst0y, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -22762,27 +36079,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .cvtps2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .mova, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, + .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -22791,28 +36106,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._pd, .cvtps2, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._pd, .mova, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .{ .reg = .st7 } }, + .unused, + .unused, .unused, .unused, .unused, @@ -22820,57 +36133,74 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .p_w, .extr, .tmp3d, .tmp1x, .ui(0), ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .word, .is = .word } }}, + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfhf2" } } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .mem(.tmp3d), .tmp1x, ._, ._ }, - .{ ._, ._, .mov, .tmp4d, .mem(.tmp3d), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, .f_, .ld, .src0d, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, .unused, .unused, .unused, @@ -22887,16 +36217,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, .unused, .unused, .unused, @@ -22907,25 +36237,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, .unused, .unused, .unused, @@ -22936,25 +36266,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfsf2" } } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, .unused, .unused, .unused, @@ -22965,23 +36295,73 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._ps, .mova, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .each = .{ .once = &.{ + .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, + .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .x87, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .st7 } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .f_p, .st, .memsia(.dst0t, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, .unused, .unused, .unused, @@ -22998,16 +36378,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, .unused, .unused, .unused, @@ -23018,25 +36398,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, .unused, .unused, .unused, @@ -23047,25 +36427,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfdf2" } } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, .unused, .unused, .unused, @@ -23076,50 +36456,105 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memsia(.src0x, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._ps, .mova, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .unused, .unused, .unused, .unused, .unused, .unused, .unused, + }, + .dst_temps = .{.{ .reg = .xmm0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, .v_dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, .unused, .unused, }, - .dst_temps = .{.{ .reg = .st0 }}, + .dst_temps = .{.{ .reg = .xmm0 }}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, + .extra_temps = .{ + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .reg = .xmm0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .each = .{ .once = &.{ + .{ ._, ._ps, .mova, .dst0x, .mem(.src0x), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp0x), .dst0x, ._, ._ }, + .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, - .unused, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, .unused, .unused, .unused, @@ -23129,27 +36564,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, - .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, - .unused, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, .unused, .unused, .unused, @@ -23159,27 +36594,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, - .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, + .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__trunctfxf2" } } }, - .unused, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, .unused, .unused, .unused, @@ -23189,11 +36624,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, - .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, @@ -23208,138 +36643,76 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }; try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); }, - .fpext => |air_tag| if (use_old) try cg.airFpext(inst) else { + .intcast => |air_tag| if (use_old) try cg.airIntCast(inst) else { const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const dst_ty = ty_op.ty.toType(); + const src_ty = cg.typeOf(ty_op.operand); var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); var res: [1]Temp = undefined; - cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + cg.select(&res, &.{dst_ty}, &ops, if (dst_ty.scalarType(zcu).abiSize(zcu) <= src_ty.scalarType(zcu).abiSize(zcu)) comptime &.{ .{ + .dst_constraints = .{.{ .int = .dword }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, - } }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .int = .qword }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, - } }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .yword, .is = .dword } }}, + .dst_constraints = .{.{ .int = .byte }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, ._, .mov, .dst0b, .mem(.src0b), ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .dword, .is = .dword } }}, + .dst_constraints = .{.{ .int = .word }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .mov, .dst0w, .mem(.src0w), ._, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }}, + .dst_constraints = .{.{ .int = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_ps, .mova, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .int = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, - .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .v_ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .mem(.src0q), ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -23348,180 +36721,109 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfsf2" } } }, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .byte } }}, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, - .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, - .{ ._, ._ss, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, - .{ ._, .v_sd, .cvtss2, .dst0x, .dst0x, .dst0d, ._ }, + .{ ._, .vp_b, .ackssw, .dst0x, .src0x, .dst0x, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, - .{ ._, .v_pd, .cvtps2, .dst0x, .dst0q, ._, ._ }, + .{ ._, .vp_b, .ackusw, .dst0x, .src0x, .dst0x, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, - .{ ._, .v_pd, .cvtps2, .dst0y, .dst0x, ._, ._ }, + .{ ._, .p_b, .ackssw, .dst0x, .dst0x, ._, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .zword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, - }, - .extra_temps = .{ - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .tmp0y, .src0x, ._, ._ }, - .{ ._, .v_pd, .cvtps2, .tmp1y, .tmp0x, ._, ._ }, - .{ ._, .v_f128, .extract, .tmp0x, .tmp0y, .ui(1), ._ }, - .{ ._, .v_pd, .mova, .mem(.dst0y), .tmp1y, ._, ._ }, - .{ ._, .v_pd, .cvtps2, .tmp1y, .tmp0x, ._, ._ }, - .{ ._, .v_pd, .mova, .memd(.dst0y, 32), .tmp1y, ._, ._ }, + .{ ._, .p_b, .ackusw, .dst0x, .dst0x, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, .vp_b, .ackssw, .dst0y, .src0y, .dst0y, ._ }, } }, }, .{ - .required_features = .{ .f16c, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .zword, .is = .qword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_pd, .cvtps2, .tmp2y, .tmp1x, ._, ._ }, - .{ ._, .v_f128, .extract, .tmp1x, .tmp1y, .ui(1), ._ }, - .{ ._, .v_pd, .mova, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp2y, ._, ._ }, - .{ ._, .v_pd, .cvtps2, .tmp2y, .tmp1x, ._, ._ }, - .{ ._, .v_pd, .mova, .memsiad(.dst0y, .@"4", .tmp0, .add_unaligned_size, 32), .tmp2y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_b, .ackusw, .dst0y, .src0y, .dst0y, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -23530,28 +36832,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, - .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .v_sd, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -23560,108 +36858,97 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._sd, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfdf2" } } }, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .ackssd, .dst0x, .src0x, .dst0x, ._ }, + .{ ._, .vp_b, .ackssw, .dst0x, .dst0x, .dst0x, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .dword, .is = .byte } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, - .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, - .{ ._, ._ps, .movl, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_w, .ackusd, .dst0x, .src0x, .dst0x, ._ }, + .{ ._, .vp_b, .ackusw, .dst0x, .dst0x, .dst0x, ._ }, } }, }, .{ - .required_features = .{ .f16c, .x87, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .extra_temps = .{ - .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_w, .ackssd, .dst0x, .dst0x, ._, ._ }, + .{ ._, .p_b, .ackssw, .dst0x, .dst0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .dword, .is = .byte } }}, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.{ .rc = .x87 }}, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .v_ps, .cvtph2, .tmp0x, .src0q, ._, ._ }, - .{ ._, .v_ss, .mov, .mem(.tmp1d), .tmp0x, ._, ._ }, - .{ ._, .f_, .ld, .mem(.tmp1d), ._, ._, ._ }, - .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, + .{ ._, .p_w, .ackusd, .dst0x, .dst0x, ._, ._ }, + .{ ._, .p_b, .ackusw, .dst0x, .dst0x, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .ackssd, .dst0y, .src0y, .dst0y, ._ }, + .{ ._, .vp_b, .ackssw, .dst0y, .dst0y, .dst0y, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .byte } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .reg = .st0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, .vp_w, .ackusd, .dst0y, .src0y, .dst0y, ._ }, + .{ ._, .vp_b, .ackusw, .dst0y, .dst0y, .dst0y, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -23670,29 +36957,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, - .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, - .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -23701,60 +36983,50 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, - .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhfxf2" } } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, - .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, - .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, - .{ ._, .f_p, .st, .memsia(.dst0t, .@"8", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -23763,23 +37035,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -23788,28 +37063,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ }, - .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -23818,152 +37091,111 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f16, .kind = .{ .reg = .ax } }, - .{ .type = .f32, .kind = .mem }, - .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendhftf2" } } }, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, - .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, - .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, - .{ ._, ._ps, .mova, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, - .each = .{ .once = &.{ - .{ ._, .v_pd, .xor, .dst0x, .dst0x, .dst0x, ._ }, - .{ ._, .v_sd, .cvtss2, .dst0x, .dst0x, .src0d, ._ }, - } }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_sd, .cvtss2, .dst0x, .src0x, .src0d, ._ }, + .{ ._, .vp_w, .ackssd, .dst0x, .src0x, .dst0x, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .rc = .sse }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._pd, .xor, .dst0x, .dst0x, ._, ._ }, - .{ ._, ._sd, .cvtss2, .dst0x, .src0d, ._, ._ }, + .{ ._, .vp_w, .ackusd, .dst0x, .src0x, .dst0x, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0d, ._, ._, ._ }, - .{ ._, .f_p, .st, .dst0q, ._, ._, ._ }, + .{ ._, .p_w, .ackssd, .dst0x, .dst0x, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .v_pd, .cvtps2, .dst0x, .src0q, ._, ._ }, + .{ ._, .p_w, .ackusd, .dst0x, .dst0x, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._pd, .cvtps2, .dst0x, .src0q, ._, ._ }, + .{ ._, .vp_w, .ackssd, .dst0y, .src0y, .dst0y, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .v_pd, .cvtps2, .dst0y, .src0x, ._, ._ }, + .{ ._, .vp_w, .ackusd, .dst0y, .src0y, .dst0y, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -23975,22 +37207,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_pd, .cvtps2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_pd, .mova, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -24002,22 +37233,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._pd, .cvtps2, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._pd, .mova, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -24029,46 +37259,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .memsia(.dst0q, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0d, ._, ._, ._ }, - .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -24079,106 +37285,68 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .memsia(.dst0t, .@"4", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, - .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, - } }, + .each = .{ .once = &.{} }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b10_00_10_00), ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .call_frame = .{ .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_d, .shuf, .dst0x, .src0x, .ui(0b10_00_10_00), ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendsftf2" } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -24187,25 +37355,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ps, .mova, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .reg = .st7 } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -24215,20 +37381,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .f_, .ld, .src0q, ._, ._, ._ }, - .{ ._, .f_p, .st, .dst0t, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .x87, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .st7 } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -24240,24 +37409,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, .f_p, .st, .memsia(.dst0t, .@"2", .tmp0, .add_unaligned_size), ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .{ .to_reg = .xmm0 }, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, - .unused, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -24265,23 +37432,48 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -24290,28 +37482,58 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .yword } }}, + .patterns = &.{ + .{ .src = .{ .mut_mem, .none, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.any_scalar_int}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24319,28 +37541,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.any_scalar_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extenddftf2" } } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24348,80 +37571,75 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, - .{ ._, ._ps, .mova, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + } } else comptime &.{ .{ + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, + .each = .{ .once = &.{ + .{ ._, ._, .movsx, .dst0d, .src0b, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .int = .byte }, .any, .any }, + .dst_constraints = .{.{ .int = .dword }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .reg = .xmm0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, .v_dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, - .{ ._, .v_dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, - .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, - .extra_temps = .{ - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, + .each = .{ .once = &.{ + .{ ._, ._, .movsx, .dst0q, .src0b, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .int = .byte }, .any, .any }, + .dst_constraints = .{.{ .int = .qword }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .reg = .xmm0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, ._dqa, .mov, .dst0x, .mem(.src0x), ._, ._ }, - .{ ._, ._dqa, .mov, .mem(.tmp0x), .dst0x, ._, ._ }, - .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .scalar_float = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, - .unused, + .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24429,26 +37647,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .reg = .xmm0 }}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._ps, .mova, .dst0x, .mem(.src0x), ._, ._ }, - .{ ._, ._ps, .mova, .mem(.tmp0x), .dst0x, ._, ._ }, - .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp0q, .src0b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .int = .byte }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, .unused, .unused, .unused, @@ -24456,29 +37677,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .signed_int = .byte }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .usize, .kind = .{ .reg = .edi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, .unused, .unused, .unused, @@ -24486,29 +37705,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .mem(.tmp2x), .tmp1x, ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp0d, .src0b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sd, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .int = .byte }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .call_frame = .{ .size = 16, .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, - .{ .type = .f80, .kind = .{ .frame = .call_frame } }, - .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__extendxftf2" } } }, + .{ .type = .u32, .kind = .{ .reg = .eax } }, + .{ .type = .usize, .kind = .{ .reg = .edi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, .unused, .unused, .unused, @@ -24516,95 +37733,71 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, - .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, - .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sd, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, + .{ ._, .@"rep _sd", .sto, ._, ._, ._, ._ }, } }, - } }) catch |err| switch (err) { - error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ - @tagName(air_tag), - ty_op.ty.toType().fmt(pt), - cg.typeOf(ty_op.operand).fmt(pt), - ops[0].tracking(cg), - }), - else => |e| return e, - }; - try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .intcast => |air_tag| if (use_old) try cg.airIntCast(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const dst_ty = ty_op.ty.toType(); - const src_ty = cg.typeOf(ty_op.operand); - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - var res: [1]Temp = undefined; - cg.select(&res, &.{dst_ty}, &ops, if (dst_ty.scalarType(zcu).abiSize(zcu) <= src_ty.scalarType(zcu).abiSize(zcu)) comptime &.{ .{ - .dst_constraints = .{.{ .int = .dword }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .dst_constraints = .{.{ .int = .qword }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_gpr, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, }, .{ - .dst_constraints = .{.{ .int = .byte }}, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0b, .mem(.src0b), ._, ._ }, + .{ ._, ._, .movsx, .dst0d, .src0w, ._, ._ }, } }, }, .{ - .dst_constraints = .{.{ .int = .word }}, + .src_constraints = .{ .{ .int = .word }, .any, .any }, + .dst_constraints = .{.{ .int = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0w, .mem(.src0w), ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .src0w, ._, ._ }, } }, }, .{ - .dst_constraints = .{.{ .int = .dword }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, + .{ ._, ._, .movsx, .dst0q, .src0w, ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .int = .word }, .any, .any }, .dst_constraints = .{.{ .int = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0q, .mem(.src0q), ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .src0w, ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .i64, .kind = .{ .reg = .rax } }, .{ .type = .usize, .kind = .{ .reg = .rdi } }, .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, @@ -24615,109 +37808,55 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .movsx, .tmp0q, .src0w, ._, ._ }, .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_b, .ackssw, .dst0x, .src0x, .dst0x, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_b, .ackusw, .dst0x, .src0x, .dst0x, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_b, .ackssw, .dst0x, .dst0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_b, .ackusw, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .int = .word }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_b, .ackssw, .dst0y, .src0y, .dst0y, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .extra_temps = .{ + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .vp_b, .ackusw, .dst0y, .src0y, .dst0y, ._ }, + .{ ._, ._, .movzx, .tmp0d, .src0w, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .signed_int = .word }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .usize, .kind = .{ .reg = .edi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24728,22 +37867,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movsx, .tmp0d, .src0w, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sd, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .int = .word }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u32, .kind = .{ .reg = .eax } }, + .{ .type = .usize, .kind = .{ .reg = .edi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24754,95 +37895,106 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movzx, .tmp0d, .src0w, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sd, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, + .{ ._, .@"rep _sd", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .qword }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .ackssd, .dst0x, .src0x, .dst0x, ._ }, - .{ ._, .vp_b, .ackssw, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, ._d, .movsx, .dst0q, .src0d, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .dword, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .int = .dword }, .any, .any }, + .dst_constraints = .{.{ .int = .qword }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .ackusd, .dst0x, .src0x, .dst0x, ._ }, - .{ ._, .vp_b, .ackusw, .dst0x, .dst0x, .dst0x, ._ }, + .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_w, .ackssd, .dst0x, .dst0x, ._, ._ }, - .{ ._, .p_b, .ackssw, .dst0x, .dst0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .dword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .extra_temps = .{ + .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .p_w, .ackusd, .dst0x, .dst0x, ._, ._ }, - .{ ._, .p_b, .ackusw, .dst0x, .dst0x, ._, ._ }, + .{ ._, ._d, .movsx, .tmp0q, .src0d, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .int = .dword }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_w, .ackssd, .dst0y, .src0y, .dst0y, ._ }, - .{ ._, .vp_b, .ackssw, .dst0y, .dst0y, .dst0y, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .byte } }}, - .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .extra_temps = .{ + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .vp_w, .ackusd, .dst0y, .src0y, .dst0y, ._ }, - .{ ._, .vp_b, .ackusw, .dst0y, .dst0y, .dst0y, ._ }, + .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .signed_int = .dword }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .i32, .kind = .{ .reg = .eax } }, + .{ .type = .usize, .kind = .{ .reg = .edi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24853,22 +38005,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sd, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .int = .dword }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u32, .kind = .{ .reg = .eax } }, + .{ .type = .usize, .kind = .{ .reg = .edi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24879,23 +38033,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sd, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, + .{ ._, .@"rep _sd", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .qword }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24906,22 +38062,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .int = .qword }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -24932,24 +38091,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .i64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, @@ -24959,25 +38119,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._sq, .lod, ._, ._, ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa2(.dst0, .src0, .add_delta_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, @@ -24987,135 +38150,72 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa2(.dst0, .src0, .add_delta_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .ackssd, .dst0x, .src0x, .dst0x, ._ }, + .{ ._, .vp_w, .movsxb, .dst0x, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .ackusd, .dst0x, .src0x, .dst0x, ._ }, - } }, - }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .qword, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_w, .ackssd, .dst0x, .dst0x, ._, ._ }, + .{ ._, .vp_w, .movzxb, .dst0x, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_w, .ackusd, .dst0x, .dst0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .ackssd, .dst0y, .src0y, .dst0y, ._ }, + .{ ._, .p_w, .movsxb, .dst0x, .src0q, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any }, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .ackusd, .dst0y, .src0y, .dst0y, ._ }, + .{ ._, .p_w, .movzxb, .dst0x, .src0q, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -25124,51 +38224,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_b, .cmpgt, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, .unused, .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -25176,70 +38248,45 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .dword } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .dword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .shuf, .dst0x, .src0x, .ui(0b10_00_10_00), ._ }, + .{ ._, .vp_w, .movsxb, .dst0y, .src0x, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .qword, .is = .dword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_d, .shuf, .dst0x, .src0x, .ui(0b10_00_10_00), ._ }, + .{ ._, .vp_w, .movzxb, .dst0y, .src0x, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -25251,21 +38298,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_w, .movsxb, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -25277,48 +38325,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_w, .movzxb, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -25329,45 +38352,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_w, .movsxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -25378,56 +38379,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_w, .movzxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .xword } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .yword } }}, - .patterns = &.{ - .{ .src = .{ .mut_mem, .none } }, - .{ .src = .{ .to_mut_sse, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.any_scalar_int}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .unused, + .unused, .unused, .unused, .unused, @@ -25437,27 +38406,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_w, .movsxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.any_scalar_int}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, .unused, .unused, .unused, @@ -25467,73 +38433,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - } }, - } } else comptime &.{ .{ - .src_constraints = .{ .{ .signed_int = .byte }, .any }, - .dst_constraints = .{.{ .signed_int = .dword }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, - .each = .{ .once = &.{ - .{ ._, ._, .movsx, .dst0d, .src0b, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .int = .byte }, .any }, - .dst_constraints = .{.{ .int = .dword }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .byte }, .any }, - .dst_constraints = .{.{ .signed_int = .qword }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, - .each = .{ .once = &.{ - .{ ._, ._, .movsx, .dst0q, .src0b, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .byte }, .any }, - .dst_constraints = .{.{ .int = .qword }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_w, .movzxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .byte }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -25544,25 +38460,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movsx, .tmp0q, .src0b, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .byte }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -25573,24 +38486,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .byte }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i32, .kind = .{ .reg = .eax } }, - .{ .type = .usize, .kind = .{ .reg = .edi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -25601,24 +38513,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movsx, .tmp0d, .src0b, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sd, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .byte }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .reg = .eax } }, - .{ .type = .usize, .kind = .{ .reg = .edi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -25629,71 +38539,71 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .tmp0d, .src0b, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sd, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, - .{ ._, .@"rep _sd", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .word }, .any }, - .dst_constraints = .{.{ .signed_int = .dword }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .movsx, .dst0d, .src0w, ._, ._ }, + .{ ._, .vp_d, .movsxb, .dst0x, .src0d, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .word }, .any }, - .dst_constraints = .{.{ .int = .dword }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .src0w, ._, ._ }, + .{ ._, .vp_d, .movzxb, .dst0x, .src0d, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .word }, .any }, - .dst_constraints = .{.{ .signed_int = .qword }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .movsx, .dst0q, .src0w, ._, ._ }, + .{ ._, .p_d, .movsxb, .dst0x, .src0d, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .word }, .any }, - .dst_constraints = .{.{ .int = .qword }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .src0w, ._, ._ }, + .{ ._, .p_d, .movzxb, .dst0x, .src0d, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .word }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .unused, + .unused, .unused, .unused, .unused, @@ -25701,28 +38611,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .movsx, .tmp0q, .src0w, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_b, .cmpgt, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklbw, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .word }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .unused, + .unused, .unused, .unused, .unused, @@ -25730,27 +38637,47 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .tmp0d, .src0w, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .word }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .movsxb, .dst0y, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .movzxb, .dst0y, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i32, .kind = .{ .reg = .eax } }, - .{ .type = .usize, .kind = .{ .reg = .edi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -25761,24 +38688,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movsx, .tmp0d, .src0w, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sd, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_d, .movsxb, .tmp1y, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .word }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .reg = .eax } }, - .{ .type = .usize, .kind = .{ .reg = .edi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -25789,49 +38715,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .tmp0d, .src0w, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sd, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, - .{ ._, .@"rep _sd", .sto, ._, ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .dword }, .any }, - .dst_constraints = .{.{ .signed_int = .qword }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, - .each = .{ .once = &.{ - .{ ._, ._d, .movsx, .dst0q, .src0d, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .dword }, .any }, - .dst_constraints = .{.{ .int = .qword }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }}, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .src0d, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_d, .movzxb, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .dword }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -25842,25 +38742,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._d, .movsx, .tmp0q, .src0d, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_d, .movsxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .dword }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -25871,24 +38769,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_d, .movzxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .dword }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i32, .kind = .{ .reg = .eax } }, - .{ .type = .usize, .kind = .{ .reg = .edi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -25899,24 +38796,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sd, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_d, .movsxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .dword }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .reg = .eax } }, - .{ .type = .usize, .kind = .{ .reg = .edi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .unused, .unused, .unused, .unused, @@ -25927,25 +38823,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sd, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_4), ._, ._ }, - .{ ._, .@"rep _sd", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_d, .movzxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -25956,25 +38850,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .qword }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -25985,25 +38876,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, .unused, .unused, .unused, @@ -26013,28 +38903,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._sq, .lod, ._, ._, ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa2(.dst0, .src0, .add_delta_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .remainder_int = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, .unused, .unused, .unused, @@ -26044,68 +38929,66 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa2(.dst0, .src0, .add_delta_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .movsxb, .dst0x, .src0q, ._, ._ }, + .{ ._, .vp_q, .movsxb, .dst0x, .src0w, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .movzxb, .dst0x, .src0q, ._, ._ }, + .{ ._, .vp_q, .movzxb, .dst0x, .src0w, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_w, .movsxb, .dst0x, .src0q, ._, ._ }, + .{ ._, .p_q, .movsxb, .dst0x, .src0w, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_w, .movzxb, .dst0x, .src0q, ._, ._ }, + .{ ._, .p_q, .movzxb, .dst0x, .src0w, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, @@ -26123,13 +39006,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, .{ ._, .p_b, .cmpgt, .tmp0x, .src0x, ._, ._ }, .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklbw, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, @@ -26146,41 +39033,43 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .movsxb, .dst0y, .src0x, ._, ._ }, + .{ ._, .vp_q, .movsxb, .dst0y, .src0d, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .movzxb, .dst0y, .src0x, ._, ._ }, + .{ ._, .vp_q, .movzxb, .dst0y, .src0d, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26193,21 +39082,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_w, .movsxb, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ .@"0:", .vp_q, .movsxb, .tmp1y, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"8", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26220,21 +39109,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_w, .movzxb, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ .@"0:", .vp_q, .movzxb, .tmp1y, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"8", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26247,21 +39136,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_w, .movsxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ .@"0:", .vp_q, .movsxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26274,21 +39163,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_w, .movzxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ .@"0:", .vp_q, .movzxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26301,21 +39190,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_w, .movsxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ .@"0:", .p_q, .movsxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26328,21 +39217,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_w, .movzxb, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ .@"0:", .p_q, .movzxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -26355,20 +39244,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -26381,21 +39271,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -26409,19 +39299,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -26435,64 +39325,68 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0w, .@"2", .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .movsxb, .dst0x, .src0d, ._, ._ }, + .{ ._, .vp_q, .movsxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .vp_q, .movsxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .movzxb, .dst0x, .src0d, ._, ._ }, + .{ ._, .vp_q, .movzxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .vp_q, .movzxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_d, .movsxb, .dst0x, .src0d, ._, ._ }, + .{ ._, .p_q, .movsxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .p_q, .movsxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_d, .movzxb, .dst0x, .src0d, ._, ._ }, + .{ ._, .p_q, .movzxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .p_q, .movzxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, @@ -26512,13 +39406,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklbw, .tmp0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, @@ -26536,43 +39434,83 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.any_scalar_signed_int}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .vp_d, .movsxb, .dst0y, .src0q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp2q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp2q, .si(63), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.any_scalar_signed_int}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .vp_d, .movzxb, .dst0y, .src0q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp2q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp2q, .si(63), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.any_scalar_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -26583,23 +39521,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movsxb, .tmp1y, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.any_scalar_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -26610,21 +39552,144 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movzxb, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .movsxw, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .movzxw, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .p_d, .movsxw, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .p_d, .movzxw, .dst0x, .src0q, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_w, .cmpgt, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .movsxw, .dst0y, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .dword } }}, + .patterns = &.{ + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_d, .movzxw, .dst0y, .src0x, ._, ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26637,21 +39702,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movsxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", .vp_d, .movsxw, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26664,17 +39729,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movzxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", .vp_d, .movzxw, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -26691,17 +39756,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_d, .movsxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", .vp_d, .movsxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .byte } }, .any }, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -26718,21 +39783,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_d, .movzxb, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", .vp_d, .movzxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26745,20 +39810,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", .p_d, .movsxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26771,21 +39837,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", .p_d, .movzxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -26798,16 +39863,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -26824,68 +39889,68 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .vp_q, .movsxw, .dst0x, .src0d, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .vp_q, .movzxw, .dst0x, .src0d, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movsxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .p_q, .movsxw, .dst0x, .src0d, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movzxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .p_q, .movzxw, .dst0x, .src0d, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26898,22 +39963,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_b, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklbw, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_w, .cmpgt, .tmp0x, .src0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .tmp0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -26926,40 +39989,39 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxb, .dst0y, .src0d, ._, ._ }, + .{ ._, .vp_q, .movsxw, .dst0y, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxb, .dst0y, .src0d, ._, ._ }, + .{ ._, .vp_q, .movzxw, .dst0y, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -26976,17 +40038,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movsxb, .tmp1y, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"8", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", .vp_q, .movsxw, .tmp1y, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27003,17 +40065,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movzxb, .tmp1y, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"8", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", .vp_q, .movzxw, .tmp1y, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27030,17 +40092,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movsxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", .vp_q, .movsxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27057,17 +40119,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movzxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", .vp_q, .movzxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27084,17 +40146,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_q, .movsxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", .p_q, .movsxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27111,44 +40173,17 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_q, .movzxb, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"8", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", .p_q, .movzxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27164,48 +40199,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1q, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -27218,72 +40227,72 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .vp_q, .movsxw, .dst0x, .src0d, ._, ._ }, .{ ._, .vp_q, .movsxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .vp_q, .movzxw, .dst0x, .src0d, ._, ._ }, .{ ._, .vp_q, .movzxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movsxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .p_q, .movsxw, .dst0x, .src0d, ._, ._ }, .{ ._, .p_q, .movsxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movzxb, .dst0x, .src0w, ._, ._ }, + .{ ._, .p_q, .movzxw, .dst0x, .src0d, ._, ._ }, .{ ._, .p_q, .movzxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27296,9 +40305,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_b, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklbw, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_w, .cmpgt, .tmp0x, .src0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .tmp0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, @@ -27307,13 +40314,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27326,48 +40333,16 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklbw, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.any_scalar_signed_int}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp2q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp2q, .si(63), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.any_scalar_signed_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27385,51 +40360,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp2q, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp2q, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._sq, .sto, ._, ._, ._, ._ }, .{ ._, ._r, .sa, .tmp2q, .si(63), ._, ._ }, .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.any_scalar_int}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } }, .any }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, .dst_constraints = .{.any_scalar_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -27447,71 +40391,71 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._sq, .sto, ._, ._, ._, ._ }, .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .movsxw, .dst0x, .src0q, ._, ._ }, + .{ ._, .vp_q, .movsxd, .dst0x, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .movzxw, .dst0x, .src0q, ._, ._ }, + .{ ._, .vp_q, .movzxd, .dst0x, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_d, .movsxw, .dst0x, .src0q, ._, ._ }, + .{ ._, .p_q, .movsxd, .dst0x, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_d, .movzxw, .dst0x, .src0q, ._, ._ }, + .{ ._, .p_q, .movzxd, .dst0x, .src0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27524,18 +40468,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_w, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_d, .cmpgt, .tmp0x, .src0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27548,42 +40492,42 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .movsxw, .dst0y, .src0x, ._, ._ }, + .{ ._, .vp_q, .movsxd, .dst0y, .src0x, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .movzxw, .dst0y, .src0x, ._, ._ }, + .{ ._, .vp_q, .movzxd, .dst0y, .src0x, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27596,21 +40540,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movsxw, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_q, .movsxd, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27623,21 +40567,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movzxw, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_q, .movzxd, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27650,21 +40594,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movsxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_q, .movsxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27677,21 +40621,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_d, .movzxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_q, .movzxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27704,21 +40648,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_d, .movsxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .p_q, .movsxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27731,20 +40675,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_d, .movzxw, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", .p_q, .movzxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -27757,20 +40702,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", ._, .movsxd, .tmp1q, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"2", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -27783,68 +40729,72 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0d, .@"2", .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memsia(.dst0q, .@"2", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxw, .dst0x, .src0d, ._, ._ }, + .{ ._, .vp_q, .movsxd, .dst0x, .src0q, ._, ._ }, + .{ ._, .vp_q, .movsxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxw, .dst0x, .src0d, ._, ._ }, + .{ ._, .vp_q, .movzxd, .dst0x, .src0q, ._, ._ }, + .{ ._, .vp_q, .movzxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movsxw, .dst0x, .src0d, ._, ._ }, + .{ ._, .p_q, .movsxd, .dst0x, .src0q, ._, ._ }, + .{ ._, .p_q, .movsxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movzxw, .dst0x, .src0d, ._, ._ }, + .{ ._, .p_q, .movzxd, .dst0x, .src0q, ._, ._ }, + .{ ._, .p_q, .movzxd, .dst0x, .dst0q, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27857,20 +40807,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_w, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_d, .cmpgt, .tmp0x, .src0x, ._, ._ }, .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpckldq, .tmp0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -27883,45 +40833,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxw, .dst0y, .src0q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxw, .dst0y, .src0q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.any_scalar_signed_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -27932,23 +40858,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movsxw, .tmp1y, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .movsxd, .tmp2q, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp2q, .si(63), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.any_scalar_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -27959,24 +40889,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movzxw, .tmp1y, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"4", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.any_scalar_signed_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .i64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, @@ -27985,25 +40919,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movsxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._sq, .lod, ._, ._, ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp4q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.any_scalar_signed_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .i64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, @@ -28012,25 +40953,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movzxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._sq, .lod, ._, ._, ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._r, .sa, .tmp4q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.any_scalar_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, @@ -28039,319 +40987,374 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_q, .movsxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sa(.src0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.any_scalar_int}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sa(.src0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ + @tagName(air_tag), + dst_ty.fmt(pt), + src_ty.fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .trunc => |air_tag| if (use_old) try cg.airTrunc(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + var res: [1]Temp = undefined; + cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ + .src_constraints = .{ .{ .signed_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .exact_signed_int = 1 }}, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .@"and", .dst0d, .si(1), ._, ._ }, + .{ ._, ._, .neg, .dst0d, ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .exact_signed_int = 1 }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .movzx, .dst0d, .mem(.src0b), ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .si(1), ._, ._ }, + .{ ._, ._, .neg, .dst0d, ._, ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .exact_int = 8 }}, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .exact_signed_int = 8 }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .movsx, .dst0d, .mem(.src0b), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .exact_unsigned_int = 8 }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .movzx, .dst0d, .mem(.src0b), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .signed_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .byte }}, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._l, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .unsigned_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .byte }}, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .@"and", .dst0b, .sa(.dst0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .any_int, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .byte }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .movzx, .dst0d, .mem(.src0b), ._, ._ }, + .{ ._, ._, .@"and", .dst0b, .sa(.dst0, .add_umax), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .{ .int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .exact_int = 16 }}, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, + }, .{ + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .exact_signed_int = 16 }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .movsx, .dst0d, .mem(.src0w), ._, ._ }, + } }, + }, .{ + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .exact_unsigned_int = 16 }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_q, .movzxw, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"4", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .mem(.src0w), ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1q, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .@"and", .dst0w, .sa(.dst0, .add_umax), ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"4", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .mem(.src0w), ._, ._ }, + .{ ._, ._, .@"and", .dst0w, .sa(.dst0, .add_umax), ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .exact_int = 32 }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxw, .dst0x, .src0d, ._, ._ }, - .{ ._, .vp_q, .movsxd, .dst0x, .dst0q, ._, ._ }, - } }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{} }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .any_int, .any, .any }, + .dst_constraints = .{.{ .exact_int = 32 }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxw, .dst0x, .src0d, ._, ._ }, - .{ ._, .vp_q, .movzxd, .dst0x, .dst0q, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .signed_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .dword }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .p_q, .movsxw, .dst0x, .src0d, ._, ._ }, - .{ ._, .p_q, .movsxd, .dst0x, .dst0q, ._, ._ }, + .{ ._, ._l, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .signed_int = .dword }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .p_q, .movzxw, .dst0x, .src0d, ._, ._ }, - .{ ._, .p_q, .movzxd, .dst0x, .dst0q, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, + .{ ._, ._l, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .unsigned_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, - }, - .extra_temps = .{ - .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_w, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .sa(.dst0, .add_umax), ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .dword }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, - }, - .extra_temps = .{ - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklwd, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, + .{ ._, ._, .@"and", .dst0d, .sa(.dst0, .add_umax), ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.any_scalar_signed_int}, + .src_constraints = .{ .any_int, .any, .any }, + .dst_constraints = .{.{ .exact_int = 64 }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .dst0q, .mem(.src0q), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .signed_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .signed_int = .qword }}, + .patterns = &.{ + .{ .src = .{ .to_mut_gpr, .none, .none } }, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .ref = .src0 }}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp2q, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp2q, .si(63), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._l, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.any_scalar_int}, + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .signed_int = .qword }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.mem}, + .dst_temps = .{.{ .rc = .general_purpose }}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp2d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .mem(.src0q), ._, ._ }, + .{ ._, ._l, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .unsigned_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .qword }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxd, .dst0x, .src0q, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ ._, ._, .bzhi, .dst0q, .src0q, .dst0q, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .qword }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxd, .dst0x, .src0q, ._, ._ }, + .{ ._, ._, .mov, .dst0d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ ._, ._, .bzhi, .dst0q, .mem(.src0q), .dst0q, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .unsigned_int = .gpr }, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .qword }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .mem, .none, .none } }, + .{ .src = .{ .to_gpr, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .p_q, .movsxd, .dst0x, .src0q, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .unsigned_int = .qword }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.{ .rc = .general_purpose }}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .p_q, .movzxd, .dst0x, .src0q, ._, ._ }, + .{ ._, ._, .mov, .dst0q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .dst0q, .mem(.src0q), ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_int, .any, .any }, + .dst_constraints = .{.{ .exact_remainder_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28359,23 +41362,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .each = .{ .once = &.{ - .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_d, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .unused, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28383,46 +41387,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{ - .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxd, .dst0y, .src0x, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .yword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, - }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxd, .dst0y, .src0x, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28433,23 +41420,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movsxd, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_signed_int, .any, .any }, + .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28460,23 +41452,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movzxd, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0y, .@"2", .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._l, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28485,25 +41480,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movsxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28514,23 +41508,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_q, .movzxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .v_dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .bzhi, .tmp2q, .memad(.src0q, .add_size, -16), .tmp2q, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp2q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28541,23 +41538,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_q, .movsxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .bzhi, .tmp2q, .memad(.src0q, .add_size, -8), .tmp2q, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28568,23 +41567,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .p_q, .movzxd, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memsia(.dst0x, .@"2", .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, + .src_constraints = .{ .any_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -28595,23 +41597,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsxd, .tmp1q, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"2", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ }, + .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -28619,77 +41623,73 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memsia(.dst0q, .@"2", .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, - }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_q, .movsxd, .dst0x, .src0q, ._, ._ }, - .{ ._, .vp_q, .movsxd, .dst0x, .dst0q, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, + .{ ._, .vp_b, .add, .dst0x, .dst0x, .lea(.tmp0x), ._ }, + .{ ._, .vp_, .xor, .dst0x, .dst0x, .lea(.tmp0x), ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, - .each = .{ .once = &.{ - .{ ._, .vp_q, .movzxd, .dst0x, .src0q, ._, ._ }, - .{ ._, .vp_q, .movzxd, .dst0x, .dst0q, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, - .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movsxd, .dst0x, .src0q, ._, ._ }, - .{ ._, .p_q, .movsxd, .dst0x, .dst0q, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, } }, }, .{ - .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_q, .movzxd, .dst0x, .src0q, ._, ._ }, - .{ ._, .p_q, .movzxd, .dst0x, .dst0q, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, + .{ ._, .p_b, .add, .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -28700,22 +41700,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_d, .cmpgt, .tmp0x, .src0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .unused, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -28726,86 +41723,72 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_, .xor, .tmp0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpckldq, .dst0x, .tmp0x, ._, ._ }, - .{ ._, .p_, .unpcklqdq, .dst0x, .tmp0x, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.any_scalar_signed_int}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .unused, .unused, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .movsxd, .tmp2q, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp2q, .si(63), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, + .{ ._, .vp_b, .add, .dst0y, .dst0y, .lea(.tmp0y), ._ }, + .{ ._, .vp_, .xor, .dst0y, .dst0y, .lea(.tmp0y), ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.any_scalar_int}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, + .unused, + .unused, .unused, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .lea, .tmp1q, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.any_scalar_signed_int}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .i64, .kind = .{ .reg = .rax } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -28813,32 +41796,31 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._sq, .lod, ._, ._, ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp4q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp3y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .vp_b, .add, .tmp3y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .xor, .tmp3y, .tmp3y, .tmp2y, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp3y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.any_scalar_signed_int}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .i64, .kind = .{ .reg = .rax } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .unused, .unused, .unused, .unused, @@ -28847,33 +41829,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .src0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._sq, .lod, ._, ._, ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._r, .sa, .tmp4q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp2y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.any_scalar_int}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -28881,30 +41858,31 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sa(.src0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp3x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .vp_b, .add, .tmp3x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_, .xor, .tmp3x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.any_scalar_int}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .unused, .unused, .unused, .unused, @@ -28913,342 +41891,425 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sa(.src0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .xor, .tmp4d, .tmp4d, ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa2(.dst0, .src0, .add_delta_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, - } }, - } }) catch |err| switch (err) { - error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ - @tagName(air_tag), - dst_ty.fmt(pt), - src_ty.fmt(pt), - ops[0].tracking(cg), - }), - else => |e| return e, - }; - try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .trunc => |air_tag| if (use_old) try cg.airTrunc(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - var res: [1]Temp = undefined; - cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{ - .src_constraints = .{ .{ .signed_int = .gpr }, .any }, - .dst_constraints = .{.{ .exact_signed_int = 1 }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .@"and", .dst0d, .si(1), ._, ._ }, - .{ ._, ._, .neg, .dst0d, ._, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .exact_signed_int = 1 }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .mem(.src0b), ._, ._ }, - .{ ._, ._, .@"and", .dst0d, .si(1), ._, ._ }, - .{ ._, ._, .neg, .dst0d, ._, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .int = .gpr }, .any }, - .dst_constraints = .{.{ .exact_int = 8 }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .exact_signed_int = 8 }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .movsx, .dst0d, .mem(.src0b), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .exact_unsigned_int = 8 }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .mem(.src0b), ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .signed_int = .gpr }, .any }, - .dst_constraints = .{.{ .signed_int = .byte }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._l, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp3x, .tmp1x, ._, ._ }, + .{ ._, .p_, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .p_b, .add, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, .p_, .xor, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .gpr }, .any }, - .dst_constraints = .{.{ .unsigned_int = .byte }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .@"and", .dst0b, .sa(.dst0, .add_umax), ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .any_int, .any }, - .dst_constraints = .{.{ .unsigned_int = .byte }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .mem(.src0b), ._, ._ }, - .{ ._, ._, .@"and", .dst0b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, + .{ ._, .p_, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .gpr }, .any }, - .dst_constraints = .{.{ .exact_int = 16 }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .exact_signed_int = 16 }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movsx, .dst0d, .mem(.src0w), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, ._ps, .mova, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp2x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .exact_unsigned_int = 16 }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_signed_int = .{ .of = .byte, .is = 1 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .mem(.src0w), ._, ._ }, - } }, - }, .{ - .required_features = .{ .fast_imm16, null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .gpr }, .any }, - .dst_constraints = .{.{ .unsigned_int = .word }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .@"and", .dst0w, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .si(1), ._, ._ }, + .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .fast_imm16, null, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .unsigned_int = .word }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_signed_int = .{ .of = .byte, .is = 1 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .mem(.src0w), ._, ._ }, - .{ ._, ._, .@"and", .dst0w, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .si(1), ._, ._ }, + .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .gpr }, .any }, - .dst_constraints = .{.{ .exact_int = 32 }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, - }, - .dst_temps = .{.{ .ref = .src0 }}, - .each = .{ .once = &.{} }, - }, .{ - .src_constraints = .{ .any_int, .any }, - .dst_constraints = .{.{ .exact_int = 32 }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .signed_int = .gpr }, .any }, - .dst_constraints = .{.{ .signed_int = .dword }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._l, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .signed_int = .dword }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, - .{ ._, ._l, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .unsigned_int = .gpr }, .any }, - .dst_constraints = .{.{ .unsigned_int = .dword }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .@"and", .dst0d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .unsigned_int = .dword }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .mem(.src0d), ._, ._ }, - .{ ._, ._, .@"and", .dst0d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_int, .any }, - .dst_constraints = .{.{ .exact_int = 64 }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0q, .mem(.src0q), ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .gpr }, .any }, - .dst_constraints = .{.{ .signed_int = .qword }}, - .patterns = &.{ - .{ .src = .{ .to_mut_gpr, .none } }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._l, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .signed_int = .qword }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0q, .mem(.src0q), ._, ._ }, - .{ ._, ._l, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .{ .unsigned_int = .gpr }, .any }, - .dst_constraints = .{.{ .unsigned_int = .qword }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ ._, ._, .bzhi, .dst0q, .src0q, .dst0q, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .unsigned_int = .qword }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ ._, ._, .bzhi, .dst0q, .mem(.src0q), .dst0q, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .gpr }, .any }, - .dst_constraints = .{.{ .unsigned_int = .qword }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .mem, .none } }, - .{ .src = .{ .to_gpr, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .dst0q, .src0q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .unsigned_int = .qword }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, - .dst_temps = .{.{ .rc = .general_purpose }}, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .dst0q, .mem(.src0q), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_int, .any }, - .dst_constraints = .{.{ .exact_remainder_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29257,23 +42318,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29284,26 +42348,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29314,28 +42374,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ }, - .{ ._, ._l, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_signed_int, .any }, - .dst_constraints = .{.{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29346,26 +42401,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ }, - .{ ._, ._l, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._r, .sa, .tmp0q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29374,24 +42427,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .bmi2, .slow_incdec, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29402,26 +42458,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, - .{ ._, ._, .bzhi, .tmp2q, .memad(.src0q, .add_size, -16), .tmp2q, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp2q, ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29432,25 +42486,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, - .{ ._, ._, .bzhi, .tmp2q, .memad(.src0q, .add_size, -8), .tmp2q, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29461,26 +42514,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-2, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp0q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp0q, .memad(.src0q, .add_size, -16), ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp0q, ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_unsigned_int, .any }, - .dst_constraints = .{.{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29491,25 +42541,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sia(-1, .dst0, .add_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp0q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp0q, .memad(.src0q, .add_size, -8), ._, ._ }, - .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp0q, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29517,24 +42566,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, - .{ ._, .vp_b, .add, .dst0x, .dst0x, .lea(.tmp0x), ._ }, - .{ ._, .vp_, .xor, .dst0x, .dst0x, .lea(.tmp0x), ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29543,22 +42592,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .byte } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29566,24 +42619,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, - .{ ._, .p_b, .add, .dst0x, .lea(.tmp0x), ._, ._ }, - .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29592,22 +42647,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, + .required_features = .{ .bmi2, .slow_incdec, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29615,22 +42676,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .byte } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29638,24 +42704,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, - .{ ._, .vp_b, .add, .dst0y, .dst0y, .lea(.tmp0y), ._ }, - .{ ._, .vp_, .xor, .dst0y, .dst0y, .lea(.tmp0y), ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .byte } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29664,25 +42732,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_32_i8, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, .unused, .unused, .unused, @@ -29690,30 +42762,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp3y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .vp_b, .add, .tmp3y, .tmp3y, .tmp2y, ._ }, - .{ ._, .vp_, .xor, .tmp3y, .tmp3y, .tmp2y, ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp3y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .byte } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29723,28 +42790,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp2y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }}, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, @@ -29752,30 +42818,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp3x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .vp_b, .add, .tmp3x, .tmp3x, .tmp2x, ._ }, - .{ ._, .vp_, .xor, .tmp3x, .tmp3x, .tmp2x, ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, + .required_features = .{ .slow_incdec, null, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -29785,28 +42847,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._l, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .byte } }}, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_i8, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, @@ -29814,31 +42877,28 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, .p_, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .p_b, .add, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, .p_, .xor, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._l, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, + .required_features = .{ .bmi2, .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29848,27 +42908,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, - .{ ._, .p_, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp3d, .memi(.src0d, .tmp1), .tmp2d, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .byte } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29878,26 +42938,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, ._ps, .mova, .tmp1x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp2x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp3d, .memi(.src0d, .tmp1), .tmp2d, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_signed_int = .{ .of = .byte, .is = 1 } }}, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29909,23 +42969,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .si(1), ._, ._ }, - .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .@"and", .tmp2b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_signed_int = .{ .of = .byte, .is = 1 } }}, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -29937,23 +42998,36 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .si(1), ._, ._ }, - .{ ._, ._, .neg, .tmp1b, ._, ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._, .@"and", .tmp2b, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .sll, .dst0x, .src0x, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_w, .sra, .dst0x, .dst0x, .uia(16, .dst0, .sub_bit_size), ._ }, + } }, + }, .{ + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -29962,26 +43036,33 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .p_w, .sll, .dst0x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, .p_w, .sra, .dst0x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -29990,27 +43071,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -30019,25 +43094,33 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_sse, .none, .none } }, + }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .each = .{ .once = &.{ + .{ ._, .vp_w, .sll, .dst0y, .src0y, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_w, .sra, .dst0y, .dst0y, .uia(16, .dst0, .sub_bit_size), ._ }, + } }, + }, .{ + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -30046,26 +43129,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -30078,22 +43156,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .vp_w, .sll, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_w, .sra, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .required_features = .{ .avx2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, .unused, @@ -30103,22 +43184,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp2y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -30131,24 +43214,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .vp_w, .sll, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_w, .sra, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, .unused, @@ -30158,24 +43242,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -30188,24 +43272,56 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .p_w, .sll, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, .p_w, .sra, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .unused, + .unused, .unused, .unused, .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, + .{ ._, .p_, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .unused, .unused, .unused, .unused, @@ -30214,23 +43330,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, + .{ ._, ._ps, .mova, .tmp1x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0b, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp2x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30243,20 +43360,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30269,21 +43386,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30296,22 +43415,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30324,24 +43442,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, .slow_incdec, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -30353,23 +43469,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -30381,23 +43495,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30409,21 +43524,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30436,22 +43552,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30464,20 +43579,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30490,21 +43606,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30517,23 +43632,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30545,24 +43661,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, .slow_incdec, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -30574,23 +43689,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -30602,22 +43716,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30631,20 +43744,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30658,22 +43770,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30685,23 +43798,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .byte, .is = 8 } }}, + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -30713,24 +43826,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -30742,25 +43853,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._l, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30774,25 +43882,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._l, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp2b, .uia(8, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -30804,25 +43909,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp3d, .memi(.src0d, .tmp1), .tmp2d, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, + .{ ._, ._l, .sa, .tmp2d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp2d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30836,22 +43942,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, .{ .@"0:", ._, .bzhi, .tmp3d, .memi(.src0d, .tmp1), .tmp2d, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp3b, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .slow_incdec, null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .required_features = .{ .fast_imm16, null, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30865,22 +43971,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .@"and", .tmp2b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .@"and", .tmp2w, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .byte, .is = .byte } }}, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -30894,30 +44000,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .@"and", .tmp2b, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp2b, ._, ._ }, + .{ ._, ._, .@"and", .tmp2d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .sll, .dst0x, .src0x, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_w, .sra, .dst0x, .dst0x, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sll, .dst0x, .src0x, .uia(32, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sra, .dst0x, .dst0x, .uia(32, .dst0, .sub_bit_size), ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -30937,22 +44043,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_w, .sll, .dst0x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, .p_w, .sra, .dst0x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, .p_d, .sll, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, .p_d, .sra, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -30972,10 +44078,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -30995,22 +44101,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_w, .sll, .dst0y, .src0y, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_w, .sra, .dst0y, .dst0y, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sll, .dst0y, .src0y, .uia(32, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sra, .dst0y, .dst0y, .uia(32, .dst0, .sub_bit_size), ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -31030,14 +44136,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -31051,23 +44157,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .vp_w, .sll, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_w, .sra, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sll, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sra, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -31088,14 +44194,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -31109,23 +44215,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .vp_w, .sll, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_w, .sra, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sll, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, + .{ ._, .vp_d, .sra, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -31146,14 +44252,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, .unused, .unused, .unused, @@ -31167,23 +44273,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .p_w, .sll, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, .p_w, .sra, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, .p_d, .sll, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, .p_d, .sra, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -31205,15 +44311,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -31234,14 +44340,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31254,20 +44360,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31280,24 +44386,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movsx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .fast_imm16, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31309,21 +44415,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memia(.src0d, .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31336,21 +44442,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31364,19 +44470,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31392,21 +44498,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31420,47 +44526,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .fast_imm16, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31475,45 +44553,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31527,23 +44579,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, @@ -31555,23 +44604,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .fast_imm16, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .required_features = .{ .bmi2, null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31583,21 +44633,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31612,19 +44662,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31638,19 +44688,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31666,21 +44716,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31694,47 +44744,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .fast_imm16, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, - }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1w, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31749,20 +44771,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .word, .is = 16 } }}, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31776,21 +44798,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31806,23 +44828,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, .{ ._, ._l, .sa, .tmp2d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, .{ ._, ._r, .sa, .tmp2d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31836,22 +44858,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, .{ .@"0:", ._, .bzhi, .tmp3d, .memi(.src0d, .tmp1), .tmp2d, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp3w, ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp3d, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .fast_imm16, null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -31865,22 +44886,23 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .@"and", .tmp2w, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, + .{ ._, ._, .@"and", .tmp2d, .sa(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .word, .is = .word } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u16, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -31888,36 +44910,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .@"and", .tmp2d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp2w, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, - .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, - }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .sll, .dst0x, .src0x, .uia(32, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_d, .sra, .dst0x, .dst0x, .uia(32, .dst0, .sub_bit_size), ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, + .{ ._, .vp_q, .add, .dst0x, .dst0x, .lea(.tmp0x), ._ }, + .{ ._, .vp_, .xor, .dst0x, .dst0x, .lea(.tmp0x), ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -31937,22 +44943,36 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, .p_d, .sll, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, .p_d, .sra, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, + .{ ._, .p_q, .add, .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -31972,10 +44992,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mut_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -31995,22 +45015,36 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, }, .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, .vp_d, .sll, .dst0y, .src0y, .uia(32, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_d, .sra, .dst0y, .dst0y, .uia(32, .dst0, .sub_bit_size), ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, + .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, + .{ ._, .vp_q, .add, .dst0y, .dst0y, .lea(.tmp0y), ._ }, + .{ ._, .vp_, .xor, .dst0y, .dst0y, .lea(.tmp0y), ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_sse, .none, .none } }, }, .extra_temps = .{ .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, @@ -32030,18 +45064,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_i32, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -32049,25 +45083,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .vp_d, .sll, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_d, .sra, .tmp1y, .tmp1y, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp3y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .vp_q, .add, .tmp3y, .tmp3y, .tmp2y, ._ }, + .{ ._, .vp_, .xor, .tmp3y, .tmp3y, .tmp2y, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp3y, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -32088,18 +45126,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -32107,25 +45145,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .vp_d, .sll, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .vp_d, .sra, .tmp1x, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ .@"0:", .vp_, .@"and", .tmp3x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .vp_q, .add, .tmp3x, .tmp3x, .tmp2x, ._ }, + .{ ._, .vp_, .xor, .tmp3x, .tmp3x, .tmp2x, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -32146,18 +45188,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i32, .kind = .{ .rc = .sse } }, - .unused, - .unused, - .unused, - .unused, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, + .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, .unused, .unused, .unused, @@ -32165,25 +45207,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ + .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .p_d, .sll, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, .p_d, .sra, .tmp1x, .uia(16, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp3x, .tmp1x, ._, ._ }, + .{ ._, .p_, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .p_q, .add, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, .p_, .xor, .tmp3x, .tmp2x, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -32205,15 +45252,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { } }, }, .{ .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .dword } }}, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, + .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, .unused, .unused, @@ -32234,14 +45281,15 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32254,20 +45302,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32280,24 +45329,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32310,20 +45359,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memia(.src0d, .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2q, .memia(.src0q, .tmp0, .add_unaligned_size), .tmp1q, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32336,21 +45386,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32363,20 +45414,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32389,24 +45441,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32419,20 +45471,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), .tmp1q, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32445,21 +45498,22 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32472,20 +45526,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32498,24 +45553,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._l, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32528,25 +45583,83 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp2q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), .tmp1q, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .unused, .unused, .unused, .unused, .unused, .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .unused, + .unused, + .unused, + .unused, .unused, .unused, }, @@ -32554,23 +45667,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, + .{ ._, ._l, .sa, .tmp2q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._r, .sa, .tmp2q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32581,21 +45698,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, + .{ .@"0:", ._, .bzhi, .tmp3q, .memi(.src0q, .tmp1), .tmp2q, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp3q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, .unused, .unused, .unused, @@ -32607,25 +45728,26 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp2q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, + .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .scalar_exact_remainder_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -32635,24 +45757,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), .tmp1d, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_int, .any, .any }, + .dst_constraints = .{.{ .scalar_exact_remainder_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -32662,24 +45787,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"8", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .@"and", .tmp1d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .dword, .is = 32 } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .scalar_exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -32689,25 +45817,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .scalar_exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -32717,28 +45852,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._l, .sa, .tmp2d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp2d, .uia(32, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .bmi2, null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -32748,26 +45887,34 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp3d, .memi(.src0d, .tmp1), .tmp2d, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp3d, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._l, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .dword, .is = .dword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .unused, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -32777,199 +45924,304 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2d, .memi(.src0d, .tmp1), ._, ._ }, - .{ ._, ._, .@"and", .tmp2d, .sa(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp2d, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._l, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, + .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, - .{ ._, .vp_q, .add, .dst0x, .dst0x, .lea(.tmp0x), ._ }, - .{ ._, .vp_, .xor, .dst0x, .dst0x, .lea(.tmp0x), ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp4q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._l, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_signed_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, - .unused, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0x, .src0x, .lea(.tmp0x), ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp4q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._l, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._r, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, - .{ ._, .p_q, .add, .dst0x, .lea(.tmp0x), ._, ._ }, - .{ ._, .p_, .xor, .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, - .unused, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .p_, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mut_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, - .unused, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.{ .ref = .src0 }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, ._ps, .@"and", .dst0x, .lea(.tmp0x), ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .bzhi, .tmp4q, .lea(.tmp1q), .tmp3q, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp4q, ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_signed_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, - .unused, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ }, - .{ ._, .vp_q, .add, .dst0y, .dst0y, .lea(.tmp0y), ._ }, - .{ ._, .vp_, .xor, .dst0y, .dst0y, .lea(.tmp0y), ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .bzhi, .tmp4q, .lea(.tmp1q), .tmp3q, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp4q, ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .scalar_unsigned_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_sse, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .usize, .kind = .{ .rc = .general_purpose } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0 } } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, + }, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .bzhi, .tmp5q, .lea(.tmp1q), .tmp3q, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", .bmi2, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, + .patterns = &.{ + .{ .src = .{ .to_mem, .none, .none } }, + }, + .extra_temps = .{ + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, .unused, .unused, .unused, }, - .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, + .dst_temps = .{.mem}, + .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp1), ._, ._ }, - .{ ._, .vp_, .@"and", .dst0y, .src0y, .lea(.tmp0y), ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .bzhi, .tmp5q, .lea(.tmp1q), .tmp3q, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_i64, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, + .unused, .unused, .unused, .unused, @@ -32977,30 +46229,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp2y, .lea(.tmp0y), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp3y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .vp_q, .add, .tmp3y, .tmp3y, .tmp2y, ._ }, - .{ ._, .vp_, .xor, .tmp3y, .tmp3y, .tmp2y, ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp3y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp3q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -33010,28 +46264,34 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1y, .lea(.tmp0y), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp2y, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp2y, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp3q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp3q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, + .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", .slow_incdec, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .unused, .unused, .unused, .unused, @@ -33039,31 +46299,32 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp3x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .vp_q, .add, .tmp3x, .tmp3x, .tmp2x, ._ }, - .{ ._, .vp_, .xor, .tmp3x, .tmp3x, .tmp2x, ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp4q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp4q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, + .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .@"64bit", null, null, null }, + .src_constraints = .{ .any_scalar_unsigned_int, .any, .any }, + .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .none, .none } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .unused, + .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .reg = .rsi } }, + .{ .type = .usize, .kind = .{ .reg = .rdi } }, + .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .u32, .kind = .{ .reg = .ecx } }, .unused, .unused, .unused, @@ -33072,118 +46333,456 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .dst_temps = .{.mem}, .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, .v_dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", .vp_, .@"and", .tmp2x, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._ }, - .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, + .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, + .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, + .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, + .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, + .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, + .{ ._, ._, .mov, .tmp4q, .ua(.dst0, .add_umax), ._, ._ }, + .{ ._, ._, .@"and", .tmp4q, .lea(.tmp1q), ._, ._ }, + .{ ._, ._sq, .sto, ._, ._, ._, ._ }, + .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, + .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, + .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ + @tagName(air_tag), + ty_op.ty.toType().fmt(pt), + cg.typeOf(ty_op.operand).fmt(pt), + ops[0].tracking(cg), + }), + else => |e| return e, + }; + try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .optional_payload_ptr => if (use_old) try cg.airOptionalPayloadPtr(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .optional_payload_ptr_set => if (use_old) try cg.airOptionalPayloadPtrSet(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const opt_ty = cg.typeOf(ty_op.operand).childType(zcu); + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + if (!opt_ty.optionalReprIsPayload(zcu)) { + const opt_child_ty = opt_ty.optionalChild(zcu); + const opt_child_abi_size: i32 = @intCast(opt_child_ty.abiSize(zcu)); + try ops[0].toOffset(opt_child_abi_size, cg); + var has_value = try cg.tempInit(.bool, .{ .immediate = 1 }); + try ops[0].store(&has_value, .{}, cg); + try has_value.die(cg); + try ops[0].toOffset(-opt_child_abi_size, cg); + } + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .unwrap_errunion_payload_ptr => if (use_old) try cg.airUnwrapErrUnionPayloadPtr(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const eu_ty = cg.typeOf(ty_op.operand).childType(zcu); + const eu_pl_ty = eu_ty.errorUnionPayload(zcu); + const eu_pl_off: i32 = @intCast(codegen.errUnionPayloadOffset(eu_pl_ty, zcu)); + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toOffset(eu_pl_off, cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .unwrap_errunion_err_ptr => if (use_old) try cg.airUnwrapErrUnionErrPtr(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const eu_ty = cg.typeOf(ty_op.operand).childType(zcu); + const eu_pl_ty = eu_ty.errorUnionPayload(zcu); + const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toOffset(eu_err_off, cg); + const err = try ops[0].load(eu_ty.errorUnionSet(zcu), .{}, cg); + try err.finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .errunion_payload_ptr_set => if (use_old) try cg.airErrUnionPayloadPtrSet(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const eu_ty = cg.typeOf(ty_op.operand).childType(zcu); + const eu_err_ty = eu_ty.errorUnionSet(zcu); + const eu_pl_ty = eu_ty.errorUnionPayload(zcu); + const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); + const eu_pl_off: i32 = @intCast(codegen.errUnionPayloadOffset(eu_pl_ty, zcu)); + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toOffset(eu_err_off, cg); + var no_err = try cg.tempInit(eu_err_ty, .{ .immediate = 0 }); + try ops[0].store(&no_err, .{}, cg); + try no_err.die(cg); + try ops[0].toOffset(eu_pl_off - eu_err_off, cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .struct_field_ptr => if (use_old) try cg.airStructFieldPtr(inst) else { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const extra = cg.air.extraData(Air.StructField, ty_pl.payload).data; + var ops = try cg.tempsFromOperands(inst, .{extra.struct_operand}); + try ops[0].toOffset(cg.fieldOffset( + cg.typeOf(extra.struct_operand), + ty_pl.ty.toType(), + extra.field_index, + ), cg); + try ops[0].finish(inst, &.{extra.struct_operand}, &ops, cg); + }, + .struct_field_ptr_index_0, + .struct_field_ptr_index_1, + .struct_field_ptr_index_2, + .struct_field_ptr_index_3, + => |air_tag| if (use_old) try cg.airStructFieldPtrIndex(inst, switch (air_tag) { + else => unreachable, + .struct_field_ptr_index_0 => 0, + .struct_field_ptr_index_1 => 1, + .struct_field_ptr_index_2 => 2, + .struct_field_ptr_index_3 => 3, + }) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toOffset(cg.fieldOffset( + cg.typeOf(ty_op.operand), + ty_op.ty.toType(), + switch (air_tag) { + else => unreachable, + .struct_field_ptr_index_0 => 0, + .struct_field_ptr_index_1 => 1, + .struct_field_ptr_index_2 => 2, + .struct_field_ptr_index_3 => 3, + }, + ), cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .struct_field_val => if (use_old) try cg.airStructFieldVal(inst) else fallback: { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const extra = cg.air.extraData(Air.StructField, ty_pl.payload).data; + const agg_ty = cg.typeOf(extra.struct_operand); + const field_ty = ty_pl.ty.toType(); + const field_off: u31 = switch (agg_ty.containerLayout(zcu)) { + .auto, .@"extern" => @intCast(agg_ty.structFieldOffset(extra.field_index, zcu)), + .@"packed" => break :fallback try cg.airStructFieldVal(inst), + }; + var ops = try cg.tempsFromOperands(inst, .{extra.struct_operand}); + // hack around Sema OPV bugs + var res = if (field_ty.hasRuntimeBitsIgnoreComptime(zcu)) + try ops[0].read(field_ty, .{ .disp = field_off }, cg) + else + try cg.tempInit(field_ty, .none); + try res.finish(inst, &.{extra.struct_operand}, &ops, cg); + }, + .set_union_tag => if (use_old) try cg.airSetUnionTag(inst) else { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + const union_ty = cg.typeOf(bin_op.lhs).childType(zcu); + const union_layout = union_ty.unionGetLayout(zcu); + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + // hack around Sema OPV bugs + if (union_layout.tag_size > 0) try ops[0].store(&ops[1], .{ + .disp = @intCast(union_layout.tagOffset()), + }, cg); + const res = try cg.tempInit(.void, .none); + try res.finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .get_union_tag => if (use_old) try cg.airGetUnionTag(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + const union_ty = cg.typeOf(ty_op.operand); + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + const union_layout = union_ty.unionGetLayout(zcu); + assert(union_layout.tag_size > 0); + const res = try ops[0].read(ty_op.ty.toType(), .{ + .disp = @intCast(union_layout.tagOffset()), + }, cg); + try res.finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .slice => if (use_old) try cg.airSlice(inst) else { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + try ops[0].toPair(&ops[1], cg); + try ops[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .slice_len => if (use_old) try cg.airSliceLen(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toSliceLen(cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .slice_ptr => if (use_old) try cg.airSlicePtr(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toSlicePtr(cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .ptr_slice_len_ptr => if (use_old) try cg.airPtrSliceLenPtr(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toOffset(8, cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .ptr_slice_ptr_ptr => if (use_old) try cg.airPtrSlicePtrPtr(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + try ops[0].toOffset(0, cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .slice_elem_val, .ptr_elem_val => |air_tag| if (use_old) switch (air_tag) { + else => unreachable, + .slice_elem_val => try cg.airSliceElemVal(inst), + .ptr_elem_val => try cg.airPtrElemVal(inst), + } else { + const bin_op = air_datas[@intFromEnum(inst)].bin_op; + const res_ty = cg.typeOf(bin_op.lhs).elemType2(zcu); + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + try ops[0].toSlicePtr(cg); + var res: [1]Temp = undefined; + if (res_ty.hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{res_ty}, &ops, comptime &.{ .{ + .dst_constraints = .{.{ .int = .byte }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .simm32, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .movzx, .dst0d, .leaa(.src0b, .add_src0_elem_size_times_src1), ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .qword } }}, + .dst_constraints = .{.{ .int = .byte }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_i64, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .{ .kind = .{ .smin_mem = .{ .ref = .dst0 } } }, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .movzx, .dst0d, .leai(.src0b, .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .int = .word }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .simm32, .none } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .rc = .general_purpose }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp4), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .lea, .tmp0p, .mem(.tmp5), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp2x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp3x, .tmp1x, ._, ._ }, - .{ ._, .p_, .@"and", .tmp3x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, .p_q, .add, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, .p_, .xor, .tmp3x, .tmp2x, ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp3x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .movzx, .dst0d, .leaa(.src0w, .add_src0_elem_size_times_src1), ._, ._ }, } }, }, .{ - .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .dst_constraints = .{.{ .int = .word }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .movzx, .dst0d, .leasi(.src0w, .@"2", .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .int = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .simm32, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .dst0d, .leaa(.src0d, .add_src0_elem_size_times_src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .int = .dword }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .dst0d, .leasi(.src0d, .@"4", .src1), ._, ._ }, + } }, + }, .{ + .dst_constraints = .{.{ .int = .qword }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .simm32, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .dst0q, .leaa(.src0q, .add_src0_elem_size_times_src1), ._, ._ }, + } }, + }, .{ + .required_features = .{ .@"64bit", null, null, null }, + .dst_constraints = .{.{ .int = .qword }}, + .patterns = &.{ + .{ .src = .{ .to_gpr, .to_gpr, .none } }, + }, + .dst_temps = .{.{ .rc = .general_purpose }}, + .each = .{ .once = &.{ + .{ ._, ._, .mov, .dst0q, .leasi(.src0q, .@"8", .src1), ._, ._ }, + } }, + } }) catch |err| switch (err) { + error.SelectFailed => { + const elem_size = res_ty.abiSize(zcu); + while (true) for (&ops) |*op| { + if (try op.toRegClass(true, .general_purpose, cg)) break; + } else break; + const lhs_reg = ops[0].unwrap(cg).temp.tracking(cg).short.register.to64(); + const rhs_reg = ops[1].unwrap(cg).temp.tracking(cg).short.register.to64(); + if (!std.math.isPowerOfTwo(elem_size)) { + try cg.spillEflagsIfOccupied(); + try cg.asmRegisterRegisterImmediate( + .{ .i_, .mul }, + rhs_reg, + rhs_reg, + .u(elem_size), + ); + try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ + .base = .{ .reg = lhs_reg }, + .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, + }); + } else if (elem_size > 8) { + try cg.spillEflagsIfOccupied(); + try cg.asmRegisterImmediate( + .{ ._l, .sh }, + rhs_reg, + .u(std.math.log2_int(u64, elem_size)), + ); + try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ + .base = .{ .reg = lhs_reg }, + .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, + }); + } else try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ + .base = .{ .reg = lhs_reg }, + .mod = .{ .rm = .{ + .size = .qword, + .index = rhs_reg, + .scale = .fromFactor(@intCast(elem_size)), + } }, + }); + res[0] = try ops[0].load(res_ty, .{}, cg); + }, + else => |e| return e, + } else { + // hack around Sema OPV bugs + res[0] = try cg.tempInit(res_ty, .none); + } + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .slice_elem_ptr, .ptr_elem_ptr => |air_tag| if (use_old) switch (air_tag) { + else => unreachable, + .slice_elem_ptr => try cg.airSliceElemPtr(inst), + .ptr_elem_ptr => try cg.airPtrElemPtr(inst), + } else { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); + try ops[0].toSlicePtr(cg); + const dst_ty = ty_pl.ty.toType(); + if (dst_ty.ptrInfo(zcu).flags.vector_index == .none) zero_offset: { + const elem_size = dst_ty.childType(zcu).abiSize(zcu); + // hack around Sema OPV bugs + if (elem_size == 0) break :zero_offset; + while (true) for (&ops) |*op| { + if (try op.toRegClass(true, .general_purpose, cg)) break; + } else break; + const lhs_reg = ops[0].unwrap(cg).temp.tracking(cg).short.register.to64(); + const rhs_reg = ops[1].unwrap(cg).temp.tracking(cg).short.register.to64(); + if (!std.math.isPowerOfTwo(elem_size)) { + try cg.spillEflagsIfOccupied(); + try cg.asmRegisterRegisterImmediate( + .{ .i_, .mul }, + rhs_reg, + rhs_reg, + .u(elem_size), + ); + try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ + .base = .{ .reg = lhs_reg }, + .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, + }); + } else if (elem_size > 8) { + try cg.spillEflagsIfOccupied(); + try cg.asmRegisterImmediate( + .{ ._l, .sh }, + rhs_reg, + .u(std.math.log2_int(u64, elem_size)), + ); + try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ + .base = .{ .reg = lhs_reg }, + .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, + }); + } else try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ + .base = .{ .reg = lhs_reg }, + .mod = .{ .rm = .{ + .size = .qword, + .index = rhs_reg, + .scale = .fromFactor(@intCast(elem_size)), + } }, + }); + } + try ops[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); + }, + .array_to_slice => if (use_old) try cg.airArrayToSlice(inst) else { + const ty_op = air_datas[@intFromEnum(inst)].ty_op; + var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); + var len = try cg.tempInit(.usize, .{ + .immediate = cg.typeOf(ty_op.operand).childType(zcu).arrayLen(zcu), + }); + try ops[0].toPair(&len, cg); + try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); + }, + .error_set_has_value => return cg.fail("TODO implement error_set_has_value", .{}), + .union_init => if (use_old) try cg.airUnionInit(inst) else { + const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; + const extra = cg.air.extraData(Air.UnionInit, ty_pl.payload).data; + const union_ty = ty_pl.ty.toType(); + var ops = try cg.tempsFromOperands(inst, .{extra.init}); + var res = try cg.tempAllocMem(union_ty); + const union_layout = union_ty.unionGetLayout(zcu); + if (union_layout.tag_size > 0) { + var tag_temp = try cg.tempFromValue(try pt.enumValueFieldIndex( + union_ty.unionTagTypeSafety(zcu).?, + extra.field_index, + )); + try res.write(&tag_temp, .{ + .disp = @intCast(union_layout.tagOffset()), + }, cg); + try tag_temp.die(cg); + } + try res.write(&ops[0], .{ + .disp = @intCast(union_layout.payloadOffset()), + }, cg); + try res.finish(inst, &.{extra.init}, &ops, cg); + }, + .mul_add => |air_tag| if (use_old) try cg.airMulAdd(inst) else { + const pl_op = air_datas[@intFromEnum(inst)].pl_op; + const bin_op = cg.air.extraData(Air.Bin, pl_op.payload).data; + var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs, pl_op.operand }); + var res: [1]Temp = undefined; + cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{ + .required_features = .{ .fma, .f16c, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, - .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, ._dqa, .mov, .tmp1x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._dqa, .mov, .tmp2x, .tmp1x, ._, ._ }, - .{ ._, .p_, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, - } }, - }, .{ - .required_features = .{ .sse, null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .qword } }}, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .to_sse, .to_sse } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } }, - .{ .kind = .{ .umax_mem = .{ .ref = .dst0, .to_signedness = .unsigned } } }, + .{ .type = .f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .f16, .kind = .{ .mut_rc = .{ .ref = .src2, .rc = .sse } } }, + .unused, + .unused, .unused, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ }, - .{ ._, ._ps, .mova, .tmp1x, .lea(.tmp0x), ._, ._ }, - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._ps, .mova, .tmp2x, .tmp1x, ._, ._ }, - .{ ._, ._ps, .@"and", .tmp2x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp2x, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp1x, .src2q, ._, ._ }, + .{ ._, .v_ss, .fmadd213, .dst0x, .tmp0x, .tmp1d, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + .{ .scalar_float = .{ .of = .word, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .{ .to_reg = .xmm2 } } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmah" } } }, + .unused, .unused, .unused, .unused, @@ -33192,25 +46791,31 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .fma, .f16c, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + .{ .scalar_float = .{ .of = .qword, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .mem, .mem } }, + .{ .src = .{ .to_sse, .mem, .mem } }, + .{ .src = .{ .mem, .to_sse, .mem } }, + .{ .src = .{ .mem, .mem, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .to_sse } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_4_f16, .kind = .{ .mut_rc = .{ .ref = .src2, .rc = .sse } } }, .unused, .unused, .unused, @@ -33219,28 +46824,35 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp1x, .src2q, ._, ._ }, + .{ ._, .v_ps, .fmadd213, .dst0x, .tmp0x, .tmp1x, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .fma, .f16c, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + .{ .scalar_float = .{ .of = .xword, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .mem, .mem, .mem } }, + .{ .src = .{ .to_sse, .mem, .mem } }, + .{ .src = .{ .mem, .to_sse, .mem } }, + .{ .src = .{ .mem, .mem, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_sse, .to_sse } }, + .{ .src = .{ .to_sse, .to_sse, .to_sse } }, }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src2, .rc = .sse } } }, + .unused, .unused, .unused, .unused, @@ -33248,28 +46860,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2q, .memia(.src0q, .tmp0, .add_unaligned_size), .tmp1q, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp1y, .src2x, ._, ._ }, + .{ ._, .v_ps, .fmadd213, .dst0y, .tmp0y, .tmp1y, ._ }, + .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .fma, .f16c, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, + .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src2, .rc = .sse } } }, + .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src2, .rc = .sse } } }, .unused, .unused, .unused, @@ -33277,221 +46890,232 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .cvtph2, .tmp3y, .memia(.src2x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .fmadd213, .tmp1y, .tmp2y, .tmp3y, ._ }, + .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmah" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .vp_, .xor, .tmp3x, .tmp3x, .tmp3x, ._ }, + .{ ._, .vp_w, .insr, .tmp1x, .tmp3x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp2x, .tmp3x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, .vp_w, .insr, .tmp3x, .tmp3x, .memia(.src2w, .tmp0, .add_unaligned_size), .ui(0) }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse4_1, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmah" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_, .xor, .tmp3x, .tmp3x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp3x, .memia(.src2w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmah" } } }, + .{ .type = .f16, .kind = .{ .reg = .ax } }, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), .tmp1q, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, .p_, .xor, .tmp3x, .tmp3x, ._, ._ }, + .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, .p_w, .insr, .tmp3x, .memia(.src2w, .tmp0, .add_unaligned_size), .ui(0), ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .p_w, .extr, .tmp5d, .tmp1x, .ui(0), ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp5w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .xword, .is = .xword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .{ .type = .f16, .kind = .{ .reg = .ax } }, + .{ .type = .f32, .kind = .mem }, + .{ .type = .f16, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f16, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmah" } } }, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"2", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .movzx, .tmp1d, .memia(.src2w, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ }, + .{ ._, ._ss, .mov, .tmp5x, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .call, .tmp6d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ }, + .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ }, + .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ }, .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_mut_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ss, .fmadd132, .dst0x, .src2x, .src1d, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_signed_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .to_mut_sse, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._l, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp1q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ss, .fmadd213, .dst0x, .src1x, .src2d, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .to_mut_sse } }, + .{ .src = .{ .mem, .to_sse, .to_mut_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .to_mut_sse } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src2 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .tmp1d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp2q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), .tmp1q, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ss, .fmadd231, .dst0x, .src0x, .src1d, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .multiple_scalar_unsigned_int = .{ .of = .yword, .is = .yword } }, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .scalar_float = .{ .of = .dword, .is = .dword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .{ .to_reg = .xmm2 } } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaf" } } }, + .unused, .unused, .unused, .unused, @@ -33500,178 +47124,126 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp1q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp1q, .memsia(.src0q, .@"4", .tmp0, .add_unaligned_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_exact_int = .{ .of = .qword, .is = 64 } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_mut_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .fmadd132, .dst0x, .src2x, .src1x, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_signed_int = .{ .of = .qword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .to_mut_sse, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, - .{ ._, ._l, .sa, .tmp2q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._r, .sa, .tmp2q, .uia(64, .dst0, .sub_bit_size), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .fmadd213, .dst0x, .src1x, .src2x, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, + .{ .scalar_float = .{ .of = .xword, .is = .dword } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .to_mut_sse } }, + .{ .src = .{ .mem, .to_sse, .to_mut_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .to_mut_sse } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src2 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ ._, ._, .mov, .tmp2d, .sa(.dst0, .add_bit_size), ._, ._ }, - .{ .@"0:", ._, .bzhi, .tmp3q, .memi(.src0q, .tmp1), .tmp2q, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp3q, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .fmadd231, .dst0x, .src0x, .src1x, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .multiple_scalar_unsigned_int = .{ .of = .qword, .is = .qword } }}, - .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, }, - .extra_temps = .{ - .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u64, .kind = .{ .rc = .general_purpose } }, - .unused, - .unused, - .unused, - .unused, - .unused, - .unused, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_mut_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_unaligned_size), ._, ._ }, - .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp2q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp2q, .memi(.src0q, .tmp1), ._, ._ }, - .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp2q, ._, ._ }, - .{ ._, ._, .lea, .tmp1d, .leaa(.tmp1, .add_src0_elem_size), ._, ._ }, - .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, - .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .fmadd132, .dst0y, .src2y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .scalar_exact_remainder_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .to_mut_sse, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .v_ps, .fmadd213, .dst0y, .src1y, .src2y, ._ }, + } }, + }, .{ + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .scalar_float = .{ .of = .yword, .is = .dword } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .to_mut_sse } }, + .{ .src = .{ .mem, .to_sse, .to_mut_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .to_mut_sse } }, + }, + .dst_temps = .{.{ .ref = .src2 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_ps, .fmadd231, .dst0y, .src0y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_int, .any }, - .dst_constraints = .{.{ .scalar_exact_remainder_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src2, .rc = .sse } } }, + .unused, .unused, .unused, .unused, @@ -33679,955 +47251,607 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sa(.dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ps, .fmadd213, .tmp1y, .tmp2y, .memia(.src2y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .scalar_exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f32, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f32, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaf" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, - .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ss, .mov, .tmp2x, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_ss, .mov, .tmp3x, .memia(.src2d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .v_ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .scalar_exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f32, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f32, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f32, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaf" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, - .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ss, .mov, .tmp1x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ss, .mov, .tmp2x, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ss, .mov, .tmp3x, .memia(.src2d, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ss, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_mut_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .fmadd132, .dst0x, .src2x, .src1q, ._ }, + } }, + }, .{ + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .to_mut_sse, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._l, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._r, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, - .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_sd, .fmadd213, .dst0x, .src1x, .src2q, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .to_mut_sse } }, + .{ .src = .{ .mem, .to_sse, .to_mut_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .to_mut_sse } }, + }, + .dst_temps = .{.{ .ref = .src2 }}, + .each = .{ .once = &.{ + .{ ._, .v_sd, .fmadd231, .dst0x, .src0x, .src1q, ._ }, + } }, + }, .{ + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .scalar_float = .{ .of = .qword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .{ .to_reg = .xmm2 } } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fma" } } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._l, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._r, .sa, .tmp3q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, - .{ ._, ._r, .sa, .tmp3q, .ui(63), ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .tmp3q, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mut_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_mut_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, }, - .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .fmadd132, .dst0x, .src2x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .to_mut_sse, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp4q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._l, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._r, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_pd, .fmadd213, .dst0x, .src1x, .src2x, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_signed_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_signed_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + .{ .scalar_float = .{ .of = .xword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_sse, .mem, .to_mut_sse } }, + .{ .src = .{ .mem, .to_sse, .to_mut_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .to_mut_sse } }, }, - .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .unused, - .unused, - .unused, - .unused, + .dst_temps = .{.{ .ref = .src2 }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .fmadd231, .dst0x, .src0x, .src1x, ._ }, + } }, + }, .{ + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .mem, .to_sse } }, + .{ .src = .{ .mem, .to_mut_sse, .to_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp4q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._l, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._r, .sa, .tmp4q, .uia(64, .dst0, .sub_bit_size_rem_64), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, .v_pd, .fmadd132, .dst0y, .src2y, .src1y, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + }, + .patterns = &.{ + .{ .src = .{ .to_mut_sse, .to_sse, .mem } }, + .{ .src = .{ .to_sse, .to_mut_sse, .mem }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mut_sse, .sse, .sse } }, + .{ .src = .{ .sse, .mut_sse, .sse }, .commute = .{ 0, 1 } }, + }, + .dst_temps = .{.{ .ref = .src0 }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .fmadd213, .dst0y, .src1y, .src2y, ._ }, + } }, + }, .{ + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .scalar_float = .{ .of = .yword, .is = .qword } }, + }, + .patterns = &.{ + .{ .src = .{ .to_sse, .mem, .to_mut_sse } }, + .{ .src = .{ .mem, .to_sse, .to_mut_sse }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_sse, .to_sse, .to_mut_sse } }, + }, + .dst_temps = .{.{ .ref = .src2 }}, + .each = .{ .once = &.{ + .{ ._, .v_pd, .fmadd231, .dst0y, .src0y, .src1y, ._ }, + } }, + }, .{ + .required_features = .{ .fma, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .vector_4_f64, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } }, + .{ .type = .vector_4_f64, .kind = .{ .mut_rc = .{ .ref = .src2, .rc = .sse } } }, + .unused, + .unused, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_pd, .fmadd213, .tmp1y, .tmp2y, .memia(.src2y, .tmp0, .add_unaligned_size), ._ }, + .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fma" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sa2(.src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_sd, .mov, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_sd, .mov, .tmp3x, .memia(.src2q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .v_sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fma" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .bzhi, .tmp4q, .lea(.tmp1q), .tmp3q, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp4q, ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._sd, .mov, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sd, .mov, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._sd, .mov, .tmp3x, .memia(.src2q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._sd, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f64, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f64, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fma" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .bzhi, .tmp4q, .lea(.tmp1q), .tmp3q, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp4q, ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ }, + .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ }, + .{ ._, ._ps, .xor, .tmp3x, .tmp3x, ._, ._ }, + .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .movl, .tmp3x, .memia(.src2q, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, .slow_incdec, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .scalar_float = .{ .of = .xword, .is = .tbyte } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .size = 16 * 3, .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmax" } } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .reg = .st0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .bzhi, .tmp5q, .lea(.tmp1q), .tmp3q, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._ps, .mova, .tmp0x, .mem(.src0x), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp1x), .tmp0x, ._, ._ }, + .{ ._, ._ps, .mova, .tmp0x, .mem(.src1x), ._, ._ }, + .{ ._, ._ps, .mova, .memd(.tmp1x, 16), .tmp0x, ._, ._ }, + .{ ._, ._ps, .mova, .tmp0x, .mem(.src2x), ._, ._ }, + .{ ._, ._ps, .mova, .memd(.tmp1x, 16 * 2), .tmp0x, ._, ._ }, + .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .bmi2, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .sse, .x87, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .size = 16 * 3, .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u8, .kind = .{ .rc = .general_purpose } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f80, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f80, .kind = .{ .frame = .call_frame } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmax" } } }, + .unused, + .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .mov, .tmp3d, .sa(.dst0, .add_bit_size_rem_64), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .bzhi, .tmp5q, .lea(.tmp1q), .tmp3q, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .mem(.tmp2x), .tmp1x, ._, ._ }, + .{ ._, ._ps, .mova, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memd(.tmp2x, 16), .tmp1x, ._, ._ }, + .{ ._, ._ps, .mova, .tmp1x, .memia(.src2x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .memd(.tmp2x, 16 * 2), .tmp1x, ._, ._ }, + .{ ._, ._, .call, .tmp3d, ._, ._, ._ }, + .{ .pseudo, .f_cstp, .de, ._, ._, ._, ._ }, + .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .scalar_float = .{ .of = .xword, .is = .xword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .{ .to_reg = .xmm2 } } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaq" } } }, + .unused, + .unused, + .unused, .unused, .unused, .unused, .unused, .unused, }, - .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .dst_temps = .{.{ .ref = .src0 }}, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp3q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }}, + .required_features = .{ .avx, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, - .unused, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaq" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ .@"0:", ._, .mov, .tmp3d, .sia(-2, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp3q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp3q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._, .mov, .lea(.tmp2q), .tmp3q, ._, ._ }, - .{ ._, ._, .mov, .lead(.tmp2q, 8), .si(0), ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .lead(.tmp2, 16), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, .v_dqa, .mov, .tmp3x, .memia(.src2x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", .slow_incdec, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .sse2, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaq" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp4q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp4q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._, .sub, .tmp0d, .si(1), ._, ._ }, - .{ ._, ._a, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._dqa, .mov, .tmp3x, .memia(.src2x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .any_scalar_unsigned_int, .any }, - .dst_constraints = .{.{ .scalar_remainder_unsigned_int = .{ .of = .xword, .is = .xword } }}, + .required_features = .{ .sse, null, null, null }, + .src_constraints = .{ + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, + }, .patterns = &.{ - .{ .src = .{ .to_mem, .none } }, + .{ .src = .{ .to_mem, .to_mem, .to_mem } }, }, + .call_frame = .{ .alignment = .@"16" }, .extra_temps = .{ - .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, - .{ .type = .usize, .kind = .{ .reg = .rsi } }, - .{ .type = .usize, .kind = .{ .reg = .rdi } }, - .{ .type = .u64, .kind = .{ .reg = .rax } }, - .{ .type = .u32, .kind = .{ .reg = .ecx } }, + .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, + .{ .type = .f128, .kind = .{ .reg = .xmm0 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm1 } }, + .{ .type = .f128, .kind = .{ .reg = .xmm2 } }, + .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaq" } } }, .unused, .unused, .unused, .unused, }, .dst_temps = .{.mem}, - .clobbers = .{ .eflags = true }, + .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, .each = .{ .once = &.{ - .{ ._, ._, .mov, .tmp0d, .sa(.src0, .add_len), ._, ._ }, - .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, - .{ ._, ._, .lea, .tmp2p, .mem(.dst0), ._, ._ }, - .{ ._, ._, .xor, .tmp3d, .tmp3d, ._, ._ }, - .{ .@"0:", ._, .mov, .tmp4d, .sia(-1, .dst0, .add_elem_size_div_8), ._, ._ }, - .{ ._, .@"rep _sq", .mov, ._, ._, ._, ._ }, - .{ ._, ._, .mov, .tmp4q, .ua(.dst0, .add_umax), ._, ._ }, - .{ ._, ._, .@"and", .tmp4q, .lea(.tmp1q), ._, ._ }, - .{ ._, ._sq, .sto, ._, ._, ._, ._ }, - .{ ._, ._, .add, .tmp1p, .sia2(8, .src0, .dst0, .add_delta_elem_size), ._, ._ }, - .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, - .{ ._, ._nz, .j, .@"0b", ._, ._, ._ }, + .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ }, + .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._ps, .mova, .tmp3x, .memia(.src2x, .tmp0, .add_unaligned_size), ._, ._ }, + .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, + .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ }, + .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, + .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, } }, } }) catch |err| switch (err) { - error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ + error.SelectFailed => return cg.fail("failed to select {s} {} {} {} {}", .{ @tagName(air_tag), - ty_op.ty.toType().fmt(pt), - cg.typeOf(ty_op.operand).fmt(pt), + cg.typeOf(bin_op.lhs).fmt(pt), ops[0].tracking(cg), + ops[1].tracking(cg), + ops[2].tracking(cg), }), else => |e| return e, }; - try res[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .optional_payload_ptr => if (use_old) try cg.airOptionalPayloadPtr(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .optional_payload_ptr_set => if (use_old) try cg.airOptionalPayloadPtrSet(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const opt_ty = cg.typeOf(ty_op.operand).childType(zcu); - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - if (!opt_ty.optionalReprIsPayload(zcu)) { - const opt_child_ty = opt_ty.optionalChild(zcu); - const opt_child_abi_size: i32 = @intCast(opt_child_ty.abiSize(zcu)); - try ops[0].toOffset(opt_child_abi_size, cg); - var has_value = try cg.tempInit(.bool, .{ .immediate = 1 }); - try ops[0].store(&has_value, .{}, cg); - try has_value.die(cg); - try ops[0].toOffset(-opt_child_abi_size, cg); - } - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .unwrap_errunion_payload_ptr => if (use_old) try cg.airUnwrapErrUnionPayloadPtr(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const eu_ty = cg.typeOf(ty_op.operand).childType(zcu); - const eu_pl_ty = eu_ty.errorUnionPayload(zcu); - const eu_pl_off: i32 = @intCast(codegen.errUnionPayloadOffset(eu_pl_ty, zcu)); - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toOffset(eu_pl_off, cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .unwrap_errunion_err_ptr => if (use_old) try cg.airUnwrapErrUnionErrPtr(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const eu_ty = cg.typeOf(ty_op.operand).childType(zcu); - const eu_pl_ty = eu_ty.errorUnionPayload(zcu); - const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toOffset(eu_err_off, cg); - const err = try ops[0].load(eu_ty.errorUnionSet(zcu), .{}, cg); - try err.finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .errunion_payload_ptr_set => if (use_old) try cg.airErrUnionPayloadPtrSet(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const eu_ty = cg.typeOf(ty_op.operand).childType(zcu); - const eu_err_ty = eu_ty.errorUnionSet(zcu); - const eu_pl_ty = eu_ty.errorUnionPayload(zcu); - const eu_err_off: i32 = @intCast(codegen.errUnionErrorOffset(eu_pl_ty, zcu)); - const eu_pl_off: i32 = @intCast(codegen.errUnionPayloadOffset(eu_pl_ty, zcu)); - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toOffset(eu_err_off, cg); - var no_err = try cg.tempInit(eu_err_ty, .{ .immediate = 0 }); - try ops[0].store(&no_err, .{}, cg); - try no_err.die(cg); - try ops[0].toOffset(eu_pl_off - eu_err_off, cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .struct_field_ptr => if (use_old) try cg.airStructFieldPtr(inst) else { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const extra = cg.air.extraData(Air.StructField, ty_pl.payload).data; - var ops = try cg.tempsFromOperands(inst, .{extra.struct_operand}); - try ops[0].toOffset(cg.fieldOffset( - cg.typeOf(extra.struct_operand), - ty_pl.ty.toType(), - extra.field_index, - ), cg); - try ops[0].finish(inst, &.{extra.struct_operand}, &ops, cg); - }, - .struct_field_ptr_index_0, - .struct_field_ptr_index_1, - .struct_field_ptr_index_2, - .struct_field_ptr_index_3, - => |air_tag| if (use_old) try cg.airStructFieldPtrIndex(inst, switch (air_tag) { - else => unreachable, - .struct_field_ptr_index_0 => 0, - .struct_field_ptr_index_1 => 1, - .struct_field_ptr_index_2 => 2, - .struct_field_ptr_index_3 => 3, - }) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toOffset(cg.fieldOffset( - cg.typeOf(ty_op.operand), - ty_op.ty.toType(), - switch (air_tag) { - else => unreachable, - .struct_field_ptr_index_0 => 0, - .struct_field_ptr_index_1 => 1, - .struct_field_ptr_index_2 => 2, - .struct_field_ptr_index_3 => 3, - }, - ), cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .struct_field_val => if (use_old) try cg.airStructFieldVal(inst) else fallback: { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const extra = cg.air.extraData(Air.StructField, ty_pl.payload).data; - const agg_ty = cg.typeOf(extra.struct_operand); - const field_ty = ty_pl.ty.toType(); - const field_off: u31 = switch (agg_ty.containerLayout(zcu)) { - .auto, .@"extern" => @intCast(agg_ty.structFieldOffset(extra.field_index, zcu)), - .@"packed" => break :fallback try cg.airStructFieldVal(inst), - }; - var ops = try cg.tempsFromOperands(inst, .{extra.struct_operand}); - // hack around Sema OPV bugs - var res = if (field_ty.hasRuntimeBitsIgnoreComptime(zcu)) - try ops[0].read(field_ty, .{ .disp = field_off }, cg) - else - try cg.tempInit(field_ty, .none); - try res.finish(inst, &.{extra.struct_operand}, &ops, cg); - }, - .set_union_tag => if (use_old) try cg.airSetUnionTag(inst) else { - const bin_op = air_datas[@intFromEnum(inst)].bin_op; - const union_ty = cg.typeOf(bin_op.lhs).childType(zcu); - const union_layout = union_ty.unionGetLayout(zcu); - var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); - // hack around Sema OPV bugs - if (union_layout.tag_size > 0) try ops[0].store(&ops[1], .{ - .disp = @intCast(union_layout.tagOffset()), - }, cg); - const res = try cg.tempInit(.void, .none); - try res.finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); - }, - .get_union_tag => if (use_old) try cg.airGetUnionTag(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - const union_ty = cg.typeOf(ty_op.operand); - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - const union_layout = union_ty.unionGetLayout(zcu); - assert(union_layout.tag_size > 0); - const res = try ops[0].read(ty_op.ty.toType(), .{ - .disp = @intCast(union_layout.tagOffset()), - }, cg); - try res.finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .slice => if (use_old) try cg.airSlice(inst) else { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; - var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); - try ops[0].toPair(&ops[1], cg); - try ops[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); - }, - .slice_len => if (use_old) try cg.airSliceLen(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toSliceLen(cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .slice_ptr => if (use_old) try cg.airSlicePtr(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toSlicePtr(cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .ptr_slice_len_ptr => if (use_old) try cg.airPtrSliceLenPtr(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toOffset(8, cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .ptr_slice_ptr_ptr => if (use_old) try cg.airPtrSlicePtrPtr(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - try ops[0].toOffset(0, cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .slice_elem_val, .ptr_elem_val => |air_tag| if (use_old) switch (air_tag) { - else => unreachable, - .slice_elem_val => try cg.airSliceElemVal(inst), - .ptr_elem_val => try cg.airPtrElemVal(inst), - } else { - const bin_op = air_datas[@intFromEnum(inst)].bin_op; - const res_ty = cg.typeOf(bin_op.lhs).elemType2(zcu); - var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); - try ops[0].toSlicePtr(cg); - var res: [1]Temp = undefined; - if (res_ty.hasRuntimeBitsIgnoreComptime(zcu)) cg.select(&res, &.{res_ty}, &ops, comptime &.{ .{ - .dst_constraints = .{.{ .int = .byte }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .simm32 } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .leaa(.src0b, .add_src0_elem_size_times_src1), ._, ._ }, - } }, - }, .{ - .dst_constraints = .{.{ .int = .byte }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .leai(.src0b, .src1), ._, ._ }, - } }, - }, .{ - .dst_constraints = .{.{ .int = .word }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .simm32 } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .leaa(.src0w, .add_src0_elem_size_times_src1), ._, ._ }, - } }, - }, .{ - .dst_constraints = .{.{ .int = .word }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .movzx, .dst0d, .leasi(.src0w, .@"2", .src1), ._, ._ }, - } }, - }, .{ - .dst_constraints = .{.{ .int = .dword }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .simm32 } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .leaa(.src0d, .add_src0_elem_size_times_src1), ._, ._ }, - } }, - }, .{ - .dst_constraints = .{.{ .int = .dword }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0d, .leasi(.src0d, .@"4", .src1), ._, ._ }, - } }, - }, .{ - .dst_constraints = .{.{ .int = .qword }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .simm32 } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0q, .leaa(.src0q, .add_src0_elem_size_times_src1), ._, ._ }, - } }, - }, .{ - .required_features = .{ .@"64bit", null, null, null }, - .dst_constraints = .{.{ .int = .qword }}, - .patterns = &.{ - .{ .src = .{ .to_gpr, .to_gpr } }, - }, - .dst_temps = .{.{ .rc = .general_purpose }}, - .each = .{ .once = &.{ - .{ ._, ._, .mov, .dst0q, .leasi(.src0q, .@"8", .src1), ._, ._ }, - } }, - } }) catch |err| switch (err) { - error.SelectFailed => { - const elem_size = res_ty.abiSize(zcu); - while (true) for (&ops) |*op| { - if (try op.toRegClass(true, .general_purpose, cg)) break; - } else break; - const lhs_reg = ops[0].unwrap(cg).temp.tracking(cg).short.register.to64(); - const rhs_reg = ops[1].unwrap(cg).temp.tracking(cg).short.register.to64(); - if (!std.math.isPowerOfTwo(elem_size)) { - try cg.spillEflagsIfOccupied(); - try cg.asmRegisterRegisterImmediate( - .{ .i_, .mul }, - rhs_reg, - rhs_reg, - .u(elem_size), - ); - try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ - .base = .{ .reg = lhs_reg }, - .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, - }); - } else if (elem_size > 8) { - try cg.spillEflagsIfOccupied(); - try cg.asmRegisterImmediate( - .{ ._l, .sh }, - rhs_reg, - .u(std.math.log2_int(u64, elem_size)), - ); - try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ - .base = .{ .reg = lhs_reg }, - .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, - }); - } else try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ - .base = .{ .reg = lhs_reg }, - .mod = .{ .rm = .{ - .size = .qword, - .index = rhs_reg, - .scale = .fromFactor(@intCast(elem_size)), - } }, - }); - res[0] = try ops[0].load(res_ty, .{}, cg); - }, - else => |e| return e, - } else { - // hack around Sema OPV bugs - res[0] = try cg.tempInit(res_ty, .none); - } - try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); - }, - .slice_elem_ptr, .ptr_elem_ptr => |air_tag| if (use_old) switch (air_tag) { - else => unreachable, - .slice_elem_ptr => try cg.airSliceElemPtr(inst), - .ptr_elem_ptr => try cg.airPtrElemPtr(inst), - } else { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data; - var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); - try ops[0].toSlicePtr(cg); - const dst_ty = ty_pl.ty.toType(); - if (dst_ty.ptrInfo(zcu).flags.vector_index == .none) zero_offset: { - const elem_size = dst_ty.childType(zcu).abiSize(zcu); - // hack around Sema OPV bugs - if (elem_size == 0) break :zero_offset; - while (true) for (&ops) |*op| { - if (try op.toRegClass(true, .general_purpose, cg)) break; - } else break; - const lhs_reg = ops[0].unwrap(cg).temp.tracking(cg).short.register.to64(); - const rhs_reg = ops[1].unwrap(cg).temp.tracking(cg).short.register.to64(); - if (!std.math.isPowerOfTwo(elem_size)) { - try cg.spillEflagsIfOccupied(); - try cg.asmRegisterRegisterImmediate( - .{ .i_, .mul }, - rhs_reg, - rhs_reg, - .u(elem_size), - ); - try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ - .base = .{ .reg = lhs_reg }, - .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, - }); - } else if (elem_size > 8) { - try cg.spillEflagsIfOccupied(); - try cg.asmRegisterImmediate( - .{ ._l, .sh }, - rhs_reg, - .u(std.math.log2_int(u64, elem_size)), - ); - try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ - .base = .{ .reg = lhs_reg }, - .mod = .{ .rm = .{ .size = .qword, .index = rhs_reg } }, - }); - } else try cg.asmRegisterMemory(.{ ._, .lea }, lhs_reg, .{ - .base = .{ .reg = lhs_reg }, - .mod = .{ .rm = .{ - .size = .qword, - .index = rhs_reg, - .scale = .fromFactor(@intCast(elem_size)), - } }, - }); - } - try ops[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); - }, - .array_to_slice => if (use_old) try cg.airArrayToSlice(inst) else { - const ty_op = air_datas[@intFromEnum(inst)].ty_op; - var ops = try cg.tempsFromOperands(inst, .{ty_op.operand}); - var len = try cg.tempInit(.usize, .{ - .immediate = cg.typeOf(ty_op.operand).childType(zcu).arrayLen(zcu), - }); - try ops[0].toPair(&len, cg); - try ops[0].finish(inst, &.{ty_op.operand}, &ops, cg); - }, - .error_set_has_value => return cg.fail("TODO implement error_set_has_value", .{}), - .union_init => if (use_old) try cg.airUnionInit(inst) else { - const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; - const extra = cg.air.extraData(Air.UnionInit, ty_pl.payload).data; - const union_ty = ty_pl.ty.toType(); - var ops = try cg.tempsFromOperands(inst, .{extra.init}); - var res = try cg.tempAllocMem(union_ty); - const union_layout = union_ty.unionGetLayout(zcu); - if (union_layout.tag_size > 0) { - var tag_temp = try cg.tempFromValue(try pt.enumValueFieldIndex( - union_ty.unionTagTypeSafety(zcu).?, - extra.field_index, - )); - try res.write(&tag_temp, .{ - .disp = @intCast(union_layout.tagOffset()), - }, cg); - try tag_temp.die(cg); - } - try res.write(&ops[0], .{ - .disp = @intCast(union_layout.payloadOffset()), - }, cg); - try res.finish(inst, &.{extra.init}, &ops, cg); + try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs, pl_op.operand }, &ops, cg); }, .field_parent_ptr => if (use_old) try cg.airFieldParentPtr(inst) else { const ty_pl = air_datas[@intFromEnum(inst)].ty_pl; @@ -39565,7 +52789,7 @@ fn genRoundLibcall(self: *CodeGen, ty: Type, src_mcv: MCValue, mode: bits.RoundM .param_types = &.{ty.toIntern()}, .callee = std.fmt.bufPrint(&callee_buf, "{s}{s}{s}", .{ floatLibcAbiPrefix(ty), - switch (mode.mode) { + switch (mode.direction) { .down => "floor", .up => "ceil", .zero => "trunc", @@ -42209,7 +55433,7 @@ fn genBinOp( } }, &.{ lhs_ty, rhs_ty }, &.{ adjusted, .{ .air_ref = rhs_air } }, .{}); }, .div_trunc, .div_floor => try self.genRoundLibcall(lhs_ty, result, .{ - .mode = switch (air_tag) { + .direction = switch (air_tag) { .div_trunc => .zero, .div_floor => .down, else => unreachable, @@ -42667,7 +55891,7 @@ fn genBinOp( dst_reg, dst_reg, bits.RoundMode.imm(.{ - .mode = switch (air_tag) { + .direction = switch (air_tag) { .div_trunc => .zero, .div_floor => .down, else => unreachable, @@ -43469,7 +56693,7 @@ fn genBinOp( switch (air_tag) { .add, .add_wrap, .sub, .sub_wrap, .mul, .mul_wrap, .div_float, .div_exact => {}, .div_trunc, .div_floor => try self.genRound(lhs_ty, dst_reg, .{ .register = dst_reg }, .{ - .mode = switch (air_tag) { + .direction = switch (air_tag) { .div_trunc => .zero, .div_floor => .down, else => unreachable, @@ -51237,10 +64461,17 @@ fn airReduce(self: *CodeGen, inst: Air.Inst.Index) !void { const acc_reg = try self.register_manager.allocReg(null, abi.RegisterClass.gp); const acc_lock = self.register_manager.lockRegAssumeUnused(acc_reg); defer self.register_manager.unlockReg(acc_lock); - var limb_offset: i31 = 0; - while (limb_offset < abi_size) : (limb_offset += 8) { + var limb_offset: i31 = @intCast((mask_len - 1) / 64 * 8); + const need_mask = mask_len % 64 != 0; + if (need_mask) try self.asmRegisterImmediate( + .{ ._, .mov }, + if (mask_len % 64 <= 32) acc_reg.to32() else acc_reg.to64(), + .u((@as(u64, std.math.maxInt(u64)) >> @truncate(-%mask_len))), + ); + var first = true; + while (true) : (limb_offset -= 8) { try self.asmRegisterMemory( - .{ ._, if (limb_offset == 0) .mov else switch (reduce.operation) { + .{ ._, if (first) if (need_mask) .@"and" else .mov else switch (reduce.operation) { .Or => .@"or", .And => .@"and", else => return self.fail("TODO implement airReduce for {}", .{operand_ty.fmt(pt)}), @@ -51251,6 +64482,8 @@ fn airReduce(self: *CodeGen, inst: Air.Inst.Index) !void { .disp = limb_offset, }), ); + if (limb_offset == 0) break; + first = false; } switch (reduce.operation) { .Or => { @@ -53741,11 +66974,11 @@ const Temp = struct { }; if (commute) std.mem.swap(Temp, &ops[0], &ops[1]); try cg.select(&res, &.{.bool}, &ops, comptime &.{ .{ - .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } }, + .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .imm8, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .imm8, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm8, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm8, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .g }}, .clobbers = .{ .eflags = true }, @@ -53753,12 +66986,12 @@ const Temp = struct { .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte } }, + .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm8 } }, - .{ .src = .{ .to_gpr, .imm8 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm8, .none } }, + .{ .src = .{ .to_gpr, .imm8, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .l }}, .clobbers = .{ .eflags = true }, @@ -53766,11 +66999,11 @@ const Temp = struct { .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .imm8, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .imm8, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm8, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm8, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .a }}, .clobbers = .{ .eflags = true }, @@ -53778,12 +67011,12 @@ const Temp = struct { .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte } }, + .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm8 } }, - .{ .src = .{ .to_gpr, .imm8 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm8, .none } }, + .{ .src = .{ .to_gpr, .imm8, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .b }}, .clobbers = .{ .eflags = true }, @@ -53791,11 +67024,11 @@ const Temp = struct { .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } }, + .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, .patterns = &.{ - .{ .src = .{ .imm16, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .imm16, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm16, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm16, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .g }}, .clobbers = .{ .eflags = true }, @@ -53803,12 +67036,12 @@ const Temp = struct { .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word } }, + .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm16 } }, - .{ .src = .{ .to_gpr, .imm16 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm16, .none } }, + .{ .src = .{ .to_gpr, .imm16, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .l }}, .clobbers = .{ .eflags = true }, @@ -53816,11 +67049,11 @@ const Temp = struct { .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } }, + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, .patterns = &.{ - .{ .src = .{ .imm16, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .imm16, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm16, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm16, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .a }}, .clobbers = .{ .eflags = true }, @@ -53828,12 +67061,12 @@ const Temp = struct { .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word } }, + .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm16 } }, - .{ .src = .{ .to_gpr, .imm16 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm16, .none } }, + .{ .src = .{ .to_gpr, .imm16, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .b }}, .clobbers = .{ .eflags = true }, @@ -53841,11 +67074,11 @@ const Temp = struct { .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } }, + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .imm32, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .imm32, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .g }}, .clobbers = .{ .eflags = true }, @@ -53853,12 +67086,12 @@ const Temp = struct { .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword } }, + .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm32 } }, - .{ .src = .{ .to_gpr, .imm32 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm32, .none } }, + .{ .src = .{ .to_gpr, .imm32, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .l }}, .clobbers = .{ .eflags = true }, @@ -53866,11 +67099,11 @@ const Temp = struct { .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .imm32, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .imm32, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .imm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .a }}, .clobbers = .{ .eflags = true }, @@ -53878,12 +67111,12 @@ const Temp = struct { .{ ._, ._, .cmp, .src0d, .src1d, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword } }, + .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm32 } }, - .{ .src = .{ .to_gpr, .imm32 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm32, .none } }, + .{ .src = .{ .to_gpr, .imm32, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .b }}, .clobbers = .{ .eflags = true }, @@ -53892,11 +67125,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .simm32, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .simm32, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .simm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .simm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .g }}, .clobbers = .{ .eflags = true }, @@ -53905,12 +67138,12 @@ const Temp = struct { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword } }, + .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .simm32 } }, - .{ .src = .{ .to_gpr, .simm32 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .simm32, .none } }, + .{ .src = .{ .to_gpr, .simm32, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .l }}, .clobbers = .{ .eflags = true }, @@ -53919,11 +67152,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .simm32, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .simm32, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, + .{ .src = .{ .simm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .simm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, }, .dst_temps = .{.{ .cc = .a }}, .clobbers = .{ .eflags = true }, @@ -53932,12 +67165,12 @@ const Temp = struct { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword } }, + .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .simm32 } }, - .{ .src = .{ .to_gpr, .simm32 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .simm32, .none } }, + .{ .src = .{ .to_gpr, .simm32, .none } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .b }}, .clobbers = .{ .eflags = true }, @@ -53949,9 +67182,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }, .{ .remainder_signed_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -53981,9 +67215,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } }, .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54010,9 +67245,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }, .{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54041,9 +67277,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .dword, .is = .dword } }, .{ .remainder_unsigned_int = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54071,15 +67308,15 @@ const Temp = struct { }, .eq, .neq => { try cg.select(&res, &.{.bool}, &ops, comptime &.{ .{ - .src_constraints = .{ .{ .int = .byte }, .{ .int = .byte } }, + .src_constraints = .{ .{ .int = .byte }, .{ .int = .byte }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm8 } }, - .{ .src = .{ .imm8, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .imm8 } }, - .{ .src = .{ .imm8, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm8, .none } }, + .{ .src = .{ .imm8, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .imm8, .none } }, + .{ .src = .{ .imm8, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .e }}, .clobbers = .{ .eflags = true }, @@ -54087,15 +67324,15 @@ const Temp = struct { .{ ._, ._, .cmp, .src0b, .src1b, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .word }, .{ .int = .word } }, + .src_constraints = .{ .{ .int = .word }, .{ .int = .word }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm16 } }, - .{ .src = .{ .imm16, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .imm16 } }, - .{ .src = .{ .imm16, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm16, .none } }, + .{ .src = .{ .imm16, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .imm16, .none } }, + .{ .src = .{ .imm16, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .e }}, .clobbers = .{ .eflags = true }, @@ -54103,15 +67340,15 @@ const Temp = struct { .{ ._, ._, .cmp, .src0w, .src1w, ._, ._ }, } }, }, .{ - .src_constraints = .{ .{ .int = .dword }, .{ .int = .dword } }, + .src_constraints = .{ .{ .int = .dword }, .{ .int = .dword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .imm32 } }, - .{ .src = .{ .imm32, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .imm32 } }, - .{ .src = .{ .imm32, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .imm32, .none } }, + .{ .src = .{ .imm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .imm32, .none } }, + .{ .src = .{ .imm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .e }}, .clobbers = .{ .eflags = true }, @@ -54120,15 +67357,15 @@ const Temp = struct { } }, }, .{ .required_features = .{ .@"64bit", null, null, null }, - .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword } }, + .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .mem, .simm32 } }, - .{ .src = .{ .simm32, .mem }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .simm32 } }, - .{ .src = .{ .simm32, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .mem } }, - .{ .src = .{ .mem, .to_gpr }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_gpr, .to_gpr } }, + .{ .src = .{ .mem, .simm32, .none } }, + .{ .src = .{ .simm32, .mem, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .simm32, .none } }, + .{ .src = .{ .simm32, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .mem, .none } }, + .{ .src = .{ .mem, .to_gpr, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_gpr, .to_gpr, .none } }, }, .dst_temps = .{.{ .cc = .e }}, .clobbers = .{ .eflags = true }, @@ -54137,11 +67374,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .sse, .mmx, null, null }, - .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword } }, + .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_mm, .mem } }, - .{ .src = .{ .mem, .to_mut_mm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_mm, .to_mm } }, + .{ .src = .{ .to_mut_mm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_mm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_mm, .to_mm, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -54165,11 +67402,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } }, + .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_xmm, .mem } }, - .{ .src = .{ .mem, .to_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_xmm, .to_xmm } }, + .{ .src = .{ .to_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_xmm, .to_xmm, .none } }, }, .extra_temps = .{ .{ .kind = .{ .rc = .sse } }, @@ -54190,11 +67427,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .sse4_1, null, null, null }, - .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } }, + .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .dst_temps = .{.{ .cc = .z }}, .clobbers = .{ .eflags = true }, @@ -54204,11 +67441,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .sse2, .fast_imm16, null, null }, - .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } }, + .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -54232,11 +67469,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .sse2, null, null, null }, - .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword } }, + .src_constraints = .{ .{ .int = .xword }, .{ .int = .xword }, .any }, .patterns = &.{ - .{ .src = .{ .to_mut_xmm, .mem } }, - .{ .src = .{ .mem, .to_mut_xmm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_mut_xmm, .to_xmm } }, + .{ .src = .{ .to_mut_xmm, .mem, .none } }, + .{ .src = .{ .mem, .to_mut_xmm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_mut_xmm, .to_xmm, .none } }, }, .extra_temps = .{ .{ .type = .u32, .kind = .{ .rc = .general_purpose } }, @@ -54260,11 +67497,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .avx2, null, null, null }, - .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword } }, + .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .extra_temps = .{ .{ .kind = .{ .rc = .sse } }, @@ -54285,11 +67522,11 @@ const Temp = struct { } }, }, .{ .required_features = .{ .avx, null, null, null }, - .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword } }, + .src_constraints = .{ .{ .int = .yword }, .{ .int = .yword }, .any }, .patterns = &.{ - .{ .src = .{ .to_ymm, .mem } }, - .{ .src = .{ .mem, .to_ymm }, .commute = .{ 0, 1 } }, - .{ .src = .{ .to_ymm, .to_ymm } }, + .{ .src = .{ .to_ymm, .mem, .none } }, + .{ .src = .{ .mem, .to_ymm, .none }, .commute = .{ 0, 1 } }, + .{ .src = .{ .to_ymm, .to_ymm, .none } }, }, .extra_temps = .{ .{ .kind = .{ .rc = .sse } }, @@ -54313,9 +67550,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .yword, .is = .xword } }, .{ .remainder_int = .{ .of = .yword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54347,9 +67585,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .yword, .is = .xword } }, .{ .remainder_int = .{ .of = .yword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54381,9 +67620,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .yword, .is = .yword } }, .{ .remainder_int = .{ .of = .yword, .is = .yword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54412,9 +67652,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .yword, .is = .yword } }, .{ .remainder_int = .{ .of = .yword, .is = .yword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54443,9 +67684,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .{ .remainder_int = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54474,9 +67716,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .{ .remainder_int = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54505,9 +67748,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .{ .remainder_int = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54537,9 +67781,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .xword, .is = .xword } }, .{ .remainder_int = .{ .of = .xword, .is = .xword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54569,9 +67814,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .{ .remainder_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54601,9 +67847,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .qword, .is = .qword } }, .{ .remainder_int = .{ .of = .qword, .is = .qword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -54630,9 +67877,10 @@ const Temp = struct { .src_constraints = .{ .{ .remainder_int = .{ .of = .dword, .is = .dword } }, .{ .remainder_int = .{ .of = .dword, .is = .dword } }, + .any, }, .patterns = &.{ - .{ .src = .{ .to_mem, .to_mem } }, + .{ .src = .{ .to_mem, .to_mem, .none } }, }, .extra_temps = .{ .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, @@ -55344,7 +68592,7 @@ const Select = struct { }; const Pattern = struct { - src: [2]Src, + src: [@intFromEnum(Select.Operand.Ref.none) - @intFromEnum(Select.Operand.Ref.src0)]Src, commute: struct { u8, u8 } = .{ 0, 0 }, const Src = union(enum) { @@ -55781,6 +69029,7 @@ const Select = struct { dst0, src0, src1, + src2, none, const Sized = packed struct(u8) { @@ -55920,6 +69169,17 @@ const Select = struct { const src1t: Sized = .{ .ref = .src1, .size = .tbyte }; const src1x: Sized = .{ .ref = .src1, .size = .xword }; const src1y: Sized = .{ .ref = .src1, .size = .yword }; + + const src2: Sized = .{ .ref = .src2, .size = .none }; + const src2b: Sized = .{ .ref = .src2, .size = .byte }; + const src2w: Sized = .{ .ref = .src2, .size = .word }; + const src2d: Sized = .{ .ref = .src2, .size = .dword }; + const src2p: Sized = .{ .ref = .src2, .size = .ptr }; + const src2g: Sized = .{ .ref = .src2, .size = .gpr }; + const src2q: Sized = .{ .ref = .src2, .size = .qword }; + const src2t: Sized = .{ .ref = .src2, .size = .tbyte }; + const src2x: Sized = .{ .ref = .src2, .size = .xword }; + const src2y: Sized = .{ .ref = .src2, .size = .yword }; }; fn typeOf(ref: Ref, s: *const Select) Type { @@ -56064,6 +69324,16 @@ const Select = struct { const src1x: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src1x }; const src1y: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src1y }; + const src2b: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2b }; + const src2w: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2w }; + const src2d: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2d }; + const src2p: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2p }; + const src2g: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2g }; + const src2q: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2q }; + const src2t: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2t }; + const src2x: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2x }; + const src2y: Select.Operand = .{ .flags = .{ .tag = .ref }, .base = .src2y }; + fn si(imm: i32) Select.Operand { return .{ .flags = .{ .tag = .simm }, .imm = imm }; } diff --git a/src/arch/x86_64/bits.zig b/src/arch/x86_64/bits.zig @@ -177,7 +177,13 @@ pub const Condition = enum(u5) { /// The immediate operand of vcvtps2ph. pub const RoundMode = packed struct(u5) { - mode: enum(u4) { + direction: Direction = .mxcsr, + precision: enum(u1) { + normal = 0b0, + inexact = 0b1, + } = .normal, + + pub const Direction = enum(u4) { /// Round to nearest (even) nearest = 0b0_00, /// Round down (toward -∞) @@ -188,11 +194,7 @@ pub const RoundMode = packed struct(u5) { zero = 0b0_11, /// Use current rounding mode of MXCSR.RC mxcsr = 0b1_00, - } = .mxcsr, - precision: enum(u1) { - normal = 0b0, - inexact = 0b1, - } = .normal, + }; pub fn imm(mode: RoundMode) Immediate { return .u(@as(@typeInfo(RoundMode).@"struct".backing_integer.?, @bitCast(mode))); diff --git a/src/arch/x86_64/encodings.zig b/src/arch/x86_64/encodings.zig @@ -19,7 +19,7 @@ pub const table = [_]Entry{ .{ .aad, .zi, &.{ .imm8 }, &.{ 0xd5 }, 0, .none, .@"32bit" }, .{ .aam, .z, &.{ }, &.{ 0xd4, 0x0a }, 0, .none, .@"32bit" }, - .{ .aam, .z, &.{ .imm8 }, &.{ 0xd4 }, 0, .none, .@"32bit" }, + .{ .aam, .zi, &.{ .imm8 }, &.{ 0xd4 }, 0, .none, .@"32bit" }, .{ .aas, .z, &.{}, &.{ 0x3f }, 0, .none, .@"32bit" }, diff --git a/test/behavior/floatop.zig b/test/behavior/floatop.zig @@ -156,7 +156,13 @@ test "cmp f128" { } test "cmp f80/c_longdouble" { - if (true) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArm()) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try testCmp(f80); try comptime testCmp(f80); @@ -453,7 +459,7 @@ test "@sin with vectors" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try testSinWithVectors(); @@ -526,7 +532,7 @@ test "@cos with vectors" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try testCosWithVectors(); @@ -600,7 +606,7 @@ test "@tan with vectors" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try testTanWithVectors(); @@ -677,7 +683,7 @@ test "@exp with vectors" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try testExpWithVectors(); @@ -749,7 +755,7 @@ test "@exp2 with @vectors" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try testExp2WithVectors(); @@ -822,7 +828,7 @@ test "@log with @vectors" { 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_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; { @@ -896,7 +902,7 @@ test "@log2 with vectors" { if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .aarch64 and builtin.os.tag == .windows) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; try testLog2WithVectors(); try comptime testLog2WithVectors(); @@ -967,7 +973,7 @@ test "@log10 with vectors" { if (builtin.zig_backend == .stage2_wasm) 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_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try testLog10WithVectors(); @@ -1188,8 +1194,7 @@ test "@floor with vectors" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64 and - !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; try testFloorWithVectors(); try comptime testFloorWithVectors(); @@ -1286,8 +1291,7 @@ test "@ceil with vectors" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64 and - !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; try testCeilWithVectors(); try comptime testCeilWithVectors(); @@ -1384,8 +1388,7 @@ test "@trunc with vectors" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64 and - !comptime std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; try testTruncWithVectors(); try comptime testTruncWithVectors(); diff --git a/test/behavior/muladd.zig b/test/behavior/muladd.zig @@ -2,16 +2,12 @@ const std = @import("std"); const builtin = @import("builtin"); const expect = std.testing.expect; -const no_x86_64_hardware_fma_support = builtin.zig_backend == .stage2_x86_64 and - !std.Target.x86.featureSetHas(builtin.cpu.features, .fma); - test "@mulAdd" { - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; - - if (no_x86_64_hardware_fma_support) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try comptime testMulAdd(); try testMulAdd(); @@ -110,10 +106,10 @@ fn vector16() !void { test "vector f16" { 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_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try comptime vector16(); @@ -135,11 +131,11 @@ fn vector32() !void { test "vector f32" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; - if (no_x86_64_hardware_fma_support) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try comptime vector32(); try vector32(); @@ -160,11 +156,11 @@ fn vector64() !void { test "vector f64" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; - if (no_x86_64_hardware_fma_support) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try comptime vector64(); try vector64(); @@ -184,12 +180,12 @@ fn vector80() !void { test "vector f80" { 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_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) 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_c and builtin.cpu.arch.isArm()) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try comptime vector80(); @@ -211,12 +207,12 @@ fn vector128() !void { test "vector f128" { 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_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) 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_c and builtin.cpu.arch.isArm()) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; try comptime vector128(); diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig @@ -102,7 +102,7 @@ test "vector float operators" { if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArm()) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .aarch64) { // Triggers an assertion with LLVM 18: diff --git a/test/behavior/x86_64/math.zig b/test/behavior/x86_64/math.zig @@ -37,6 +37,14 @@ inline fn splat(comptime Type: type, scalar: Scalar(Type)) Type { .vector => @splat(scalar), }; } +// inline to avoid a runtime `@select` +inline fn select(cond: anytype, lhs: anytype, rhs: @TypeOf(lhs)) @TypeOf(lhs) { + return switch (@typeInfo(@TypeOf(cond))) { + .bool => if (cond) lhs else rhs, + .vector => @select(Scalar(@TypeOf(lhs)), cond, lhs, rhs), + else => @compileError(@typeName(@TypeOf(cond))), + }; +} fn sign(rhs: anytype) switch (@typeInfo(@TypeOf(rhs))) { else => bool, .vector => |vector| @Vector(vector.len, bool), @@ -84,65 +92,78 @@ fn boolOr(lhs: anytype, rhs: @TypeOf(lhs)) @TypeOf(lhs) { @compileError("unsupported boolOr type: " ++ @typeName(@TypeOf(lhs))); } +const Compare = enum { strict, relaxed, approx, approx_int }; // noinline for a more helpful stack trace -noinline fn checkExpected(expected: anytype, actual: @TypeOf(expected), comptime strict: bool) !void { - const info = @typeInfo(@TypeOf(expected)); - const unexpected = unexpected: switch (switch (info) { - else => info, - .vector => |vector| @typeInfo(vector.child), - }) { +noinline fn checkExpected(expected: anytype, actual: @TypeOf(expected), comptime compare: Compare) !void { + const Expected = @TypeOf(expected); + const unexpected = unexpected: switch (@typeInfo(Scalar(Expected))) { else => expected != actual, - .float => { - const unequal = boolAnd(expected != actual, boolOr(expected == expected, actual == actual)); - break :unexpected switch (strict) { - false => unequal, - true => boolOr(unequal, sign(expected) != sign(actual)), - }; + .float => switch (compare) { + .strict, .relaxed => { + const unequal = boolAnd(expected != actual, boolOr(expected == expected, actual == actual)); + break :unexpected switch (compare) { + .strict => boolOr(unequal, sign(expected) != sign(actual)), + .relaxed => unequal, + .approx, .approx_int => comptime unreachable, + }; + }, + .approx, .approx_int => { + const epsilon = math.floatEps(Scalar(Expected)); + const tolerance = @sqrt(epsilon); + break :unexpected @abs(expected - actual) > @max( + @abs(expected) * splat(Expected, tolerance), + splat(Expected, switch (compare) { + .strict, .relaxed => comptime unreachable, + .approx => tolerance, + .approx_int => 1, + }), + ); + }, }, }; - if (switch (info) { + if (switch (@typeInfo(Expected)) { else => unexpected, .vector => @reduce(.Or, unexpected), }) return error.Unexpected; } test checkExpected { - if (checkExpected(nan(f16), nan(f16), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(nan(f16), -nan(f16), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f16, 0.0), @as(f16, 0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f16, -0.0), @as(f16, -0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f16, -0.0), @as(f16, 0.0), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f16, 0.0), @as(f16, -0.0), true) != error.Unexpected) return error.Unexpected; - - if (checkExpected(nan(f32), nan(f32), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(nan(f32), -nan(f32), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f32, 0.0), @as(f32, 0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f32, -0.0), @as(f32, -0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f32, -0.0), @as(f32, 0.0), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f32, 0.0), @as(f32, -0.0), true) != error.Unexpected) return error.Unexpected; - - if (checkExpected(nan(f64), nan(f64), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(nan(f64), -nan(f64), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f64, 0.0), @as(f64, 0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f64, -0.0), @as(f64, -0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f64, -0.0), @as(f64, 0.0), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f64, 0.0), @as(f64, -0.0), true) != error.Unexpected) return error.Unexpected; - - if (checkExpected(nan(f80), nan(f80), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(nan(f80), -nan(f80), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f80, 0.0), @as(f80, 0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f80, -0.0), @as(f80, -0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f80, -0.0), @as(f80, 0.0), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f80, 0.0), @as(f80, -0.0), true) != error.Unexpected) return error.Unexpected; - - if (checkExpected(nan(f128), nan(f128), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(nan(f128), -nan(f128), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f128, 0.0), @as(f128, 0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f128, -0.0), @as(f128, -0.0), true) == error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f128, -0.0), @as(f128, 0.0), true) != error.Unexpected) return error.Unexpected; - if (checkExpected(@as(f128, 0.0), @as(f128, -0.0), true) != error.Unexpected) return error.Unexpected; + if (checkExpected(nan(f16), nan(f16), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(nan(f16), -nan(f16), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f16, 0.0), @as(f16, 0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f16, -0.0), @as(f16, -0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f16, -0.0), @as(f16, 0.0), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f16, 0.0), @as(f16, -0.0), .strict) != error.Unexpected) return error.Unexpected; + + if (checkExpected(nan(f32), nan(f32), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(nan(f32), -nan(f32), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f32, 0.0), @as(f32, 0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f32, -0.0), @as(f32, -0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f32, -0.0), @as(f32, 0.0), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f32, 0.0), @as(f32, -0.0), .strict) != error.Unexpected) return error.Unexpected; + + if (checkExpected(nan(f64), nan(f64), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(nan(f64), -nan(f64), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f64, 0.0), @as(f64, 0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f64, -0.0), @as(f64, -0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f64, -0.0), @as(f64, 0.0), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f64, 0.0), @as(f64, -0.0), .strict) != error.Unexpected) return error.Unexpected; + + if (checkExpected(nan(f80), nan(f80), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(nan(f80), -nan(f80), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f80, 0.0), @as(f80, 0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f80, -0.0), @as(f80, -0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f80, -0.0), @as(f80, 0.0), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f80, 0.0), @as(f80, -0.0), .strict) != error.Unexpected) return error.Unexpected; + + if (checkExpected(nan(f128), nan(f128), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(nan(f128), -nan(f128), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f128, 0.0), @as(f128, 0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f128, -0.0), @as(f128, -0.0), .strict) == error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f128, -0.0), @as(f128, 0.0), .strict) != error.Unexpected) return error.Unexpected; + if (checkExpected(@as(f128, 0.0), @as(f128, -0.0), .strict) != error.Unexpected) return error.Unexpected; } -fn unary(comptime op: anytype, comptime opts: struct { strict: bool = false }) type { +fn unary(comptime op: anytype, comptime opts: struct { compare: Compare = .relaxed }) type { return struct { // noinline so that `mem_arg` is on the stack noinline fn testArgKinds( @@ -169,9 +190,9 @@ fn unary(comptime op: anytype, comptime opts: struct { strict: bool = false }) t const expected = comptime op(Type, imm_arg); var reg_arg = mem_arg; _ = .{&reg_arg}; - try checkExpected(expected, op(Type, reg_arg), opts.strict); - try checkExpected(expected, op(Type, mem_arg), opts.strict); - try checkExpected(expected, op(Type, imm_arg), opts.strict); + try checkExpected(expected, op(Type, reg_arg), opts.compare); + try checkExpected(expected, op(Type, mem_arg), opts.compare); + try checkExpected(expected, op(Type, imm_arg), opts.compare); } // noinline for a more helpful stack trace noinline fn testArgs(comptime Type: type, comptime imm_arg: Type) !void { @@ -1628,7 +1649,7 @@ fn unary(comptime op: anytype, comptime opts: struct { strict: bool = false }) t }; } -fn cast(comptime op: anytype, comptime opts: struct { strict: bool = false }) type { +fn cast(comptime op: anytype, comptime opts: struct { compare: Compare = .relaxed }) type { return struct { // noinline so that `mem_arg` is on the stack noinline fn testArgKinds( @@ -1656,9 +1677,9 @@ fn cast(comptime op: anytype, comptime opts: struct { strict: bool = false }) ty const expected = comptime op(Result, Type, imm_arg, imm_arg); var reg_arg = mem_arg; _ = .{&reg_arg}; - try checkExpected(expected, op(Result, Type, reg_arg, imm_arg), opts.strict); - try checkExpected(expected, op(Result, Type, mem_arg, imm_arg), opts.strict); - try checkExpected(expected, op(Result, Type, imm_arg, imm_arg), opts.strict); + try checkExpected(expected, op(Result, Type, reg_arg, imm_arg), opts.compare); + try checkExpected(expected, op(Result, Type, mem_arg, imm_arg), opts.compare); + try checkExpected(expected, op(Result, Type, imm_arg, imm_arg), opts.compare); } // noinline for a more helpful stack trace noinline fn testArgs(comptime Result: type, comptime Type: type, comptime imm_arg: Type) !void { @@ -8504,7 +8525,7 @@ fn cast(comptime op: anytype, comptime opts: struct { strict: bool = false }) ty }; } -fn binary(comptime op: anytype, comptime opts: struct { strict: bool = false }) type { +fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .relaxed }) type { return struct { // noinline so that `mem_lhs` and `mem_rhs` are on the stack noinline fn testArgKinds( @@ -8534,14 +8555,14 @@ fn binary(comptime op: anytype, comptime opts: struct { strict: bool = false }) var reg_lhs = mem_lhs; var reg_rhs = mem_rhs; _ = .{ &reg_lhs, &reg_rhs }; - try checkExpected(expected, op(Type, reg_lhs, reg_rhs), opts.strict); - try checkExpected(expected, op(Type, reg_lhs, mem_rhs), opts.strict); - try checkExpected(expected, op(Type, reg_lhs, imm_rhs), opts.strict); - try checkExpected(expected, op(Type, mem_lhs, reg_rhs), opts.strict); - try checkExpected(expected, op(Type, mem_lhs, mem_rhs), opts.strict); - try checkExpected(expected, op(Type, mem_lhs, imm_rhs), opts.strict); - try checkExpected(expected, op(Type, imm_lhs, reg_rhs), opts.strict); - try checkExpected(expected, op(Type, imm_lhs, mem_rhs), opts.strict); + try checkExpected(expected, op(Type, reg_lhs, reg_rhs), opts.compare); + try checkExpected(expected, op(Type, reg_lhs, mem_rhs), opts.compare); + try checkExpected(expected, op(Type, reg_lhs, imm_rhs), opts.compare); + try checkExpected(expected, op(Type, mem_lhs, reg_rhs), opts.compare); + try checkExpected(expected, op(Type, mem_lhs, mem_rhs), opts.compare); + try checkExpected(expected, op(Type, mem_lhs, imm_rhs), opts.compare); + try checkExpected(expected, op(Type, imm_lhs, reg_rhs), opts.compare); + try checkExpected(expected, op(Type, imm_lhs, mem_rhs), opts.compare); } // noinline for a more helpful stack trace noinline fn testArgs(comptime Type: type, comptime imm_lhs: Type, comptime imm_rhs: Type) !void { @@ -11315,6 +11336,124 @@ fn binary(comptime op: anytype, comptime opts: struct { strict: bool = false }) }; } +inline fn add(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs + rhs) { + return lhs + rhs; +} +test add { + const test_add = binary(add, .{}); + try test_add.testFloats(); + try test_add.testFloatVectors(); +} + +inline fn subtract(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs - rhs) { + return lhs - rhs; +} +test subtract { + const test_subtract = binary(subtract, .{}); + try test_subtract.testFloats(); + try test_subtract.testFloatVectors(); +} + +inline fn multiply(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs * rhs) { + if (@inComptime() and @typeInfo(Type) == .vector) { + // workaround https://github.com/ziglang/zig/issues/22743 + // TODO: return @select(Scalar(Type), boolAnd(lhs == lhs, rhs == rhs), lhs * rhs, lhs + rhs); + // workaround https://github.com/ziglang/zig/issues/22744 + var res: Type = undefined; + for (0..@typeInfo(Type).vector.len) |i| res[i] = lhs[i] * rhs[i]; + return res; + } + // workaround https://github.com/ziglang/zig/issues/22745 + // TODO: return lhs * rhs; + var rt_lhs = lhs; + var rt_rhs = rhs; + _ = .{ &rt_lhs, &rt_rhs }; + return rt_lhs * rt_rhs; +} +test multiply { + const test_multiply = binary(multiply, .{}); + try test_multiply.testFloats(); + try test_multiply.testFloatVectors(); +} + +inline fn divide(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs / rhs) { + return lhs / rhs; +} +test divide { + const test_divide = binary(divide, .{ .compare = .approx }); + try test_divide.testFloats(); + try test_divide.testFloatVectors(); +} + +// workaround https://github.com/ziglang/zig/issues/22748 +// TODO: @TypeOf(@divTrunc(lhs, rhs)) +inline fn divTrunc(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs / rhs) { + if (@inComptime()) { + // workaround https://github.com/ziglang/zig/issues/22748 + return @trunc(lhs / rhs); + } + // workaround https://github.com/ziglang/zig/issues/22748 + // workaround https://github.com/ziglang/zig/issues/22749 + // TODO: return @divTrunc(lhs, rhs); + var rt_lhs = lhs; + var rt_rhs = rhs; + _ = .{ &rt_lhs, &rt_rhs }; + return @divTrunc(rt_lhs, rt_rhs); +} +test divTrunc { + const test_div_trunc = binary(divTrunc, .{ .compare = .approx_int }); + try test_div_trunc.testFloats(); + try test_div_trunc.testFloatVectors(); +} + +// workaround https://github.com/ziglang/zig/issues/22748 +// TODO: @TypeOf(@divFloor(lhs, rhs)) +inline fn divFloor(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs / rhs) { + if (@inComptime()) { + // workaround https://github.com/ziglang/zig/issues/22748 + return @floor(lhs / rhs); + } + // workaround https://github.com/ziglang/zig/issues/22748 + // workaround https://github.com/ziglang/zig/issues/22749 + // TODO: return @divFloor(lhs, rhs); + var rt_lhs = lhs; + var rt_rhs = rhs; + _ = &rt_lhs; + _ = &rt_rhs; + return @divFloor(rt_lhs, rt_rhs); +} +test divFloor { + const test_div_floor = binary(divFloor, .{ .compare = .approx_int }); + try test_div_floor.testFloats(); + try test_div_floor.testFloatVectors(); +} + +// workaround https://github.com/ziglang/zig/issues/22748 +// TODO: @TypeOf(@rem(lhs, rhs)) +inline fn rem(comptime Type: type, lhs: Type, rhs: Type) Type { + if (@inComptime()) { + // workaround https://github.com/ziglang/zig/issues/22748 + switch (@typeInfo(Type)) { + else => return if (rhs != 0) @rem(lhs, rhs) else nan(Type), + .vector => |info| { + var res: Type = undefined; + inline for (0..info.len) |i| res[i] = if (rhs[i] != 0) @rem(lhs[i], rhs[i]) else nan(Scalar(Type)); + return res; + }, + } + } + // workaround https://github.com/ziglang/zig/issues/22748 + // TODO: return @rem(lhs, rhs); + var rt_rhs = rhs; + _ = &rt_rhs; + return @rem(lhs, rt_rhs); +} +test rem { + const test_rem = binary(rem, .{}); + try test_rem.testFloats(); + try test_rem.testFloatVectors(); +} + inline fn bitNot(comptime Type: type, rhs: Type) @TypeOf(~rhs) { return ~rhs; } @@ -11324,24 +11463,150 @@ test bitNot { try test_bit_not.testIntVectors(); } +inline fn clz(comptime Type: type, rhs: Type) @TypeOf(@clz(rhs)) { + return @clz(rhs); +} +test clz { + const test_clz = unary(clz, .{}); + try test_clz.testInts(); + try test_clz.testIntVectors(); +} + +inline fn sqrt(comptime Type: type, rhs: Type) @TypeOf(@sqrt(rhs)) { + return @sqrt(rhs); +} +test sqrt { + const test_sqrt = unary(sqrt, .{}); + try test_sqrt.testFloats(); + try test_sqrt.testFloatVectors(); +} + +inline fn sin(comptime Type: type, rhs: Type) @TypeOf(@sin(rhs)) { + return @sin(rhs); +} +test sin { + const test_sin = unary(sin, .{ .compare = .strict }); + try test_sin.testFloats(); + try test_sin.testFloatVectors(); +} + +inline fn cos(comptime Type: type, rhs: Type) @TypeOf(@cos(rhs)) { + return @cos(rhs); +} +test cos { + const test_cos = unary(cos, .{ .compare = .strict }); + try test_cos.testFloats(); + try test_cos.testFloatVectors(); +} + +inline fn tan(comptime Type: type, rhs: Type) @TypeOf(@tan(rhs)) { + return @tan(rhs); +} +test tan { + const test_tan = unary(tan, .{ .compare = .strict }); + try test_tan.testFloats(); + try test_tan.testFloatVectors(); +} + +inline fn exp(comptime Type: type, rhs: Type) @TypeOf(@exp(rhs)) { + return @exp(rhs); +} +test exp { + const test_exp = unary(exp, .{ .compare = .strict }); + try test_exp.testFloats(); + try test_exp.testFloatVectors(); +} + +inline fn exp2(comptime Type: type, rhs: Type) @TypeOf(@exp2(rhs)) { + return @exp2(rhs); +} +test exp2 { + const test_exp2 = unary(exp2, .{ .compare = .strict }); + try test_exp2.testFloats(); + try test_exp2.testFloatVectors(); +} + +inline fn log(comptime Type: type, rhs: Type) @TypeOf(@log(rhs)) { + return @log(rhs); +} +test log { + const test_log = unary(log, .{ .compare = .strict }); + try test_log.testFloats(); + try test_log.testFloatVectors(); +} + +inline fn log2(comptime Type: type, rhs: Type) @TypeOf(@log2(rhs)) { + return @log2(rhs); +} +test log2 { + const test_log2 = unary(log2, .{ .compare = .strict }); + try test_log2.testFloats(); + try test_log2.testFloatVectors(); +} + +inline fn log10(comptime Type: type, rhs: Type) @TypeOf(@log10(rhs)) { + return @log10(rhs); +} +test log10 { + const test_log10 = unary(log10, .{ .compare = .strict }); + try test_log10.testFloats(); + try test_log10.testFloatVectors(); +} + inline fn abs(comptime Type: type, rhs: Type) @TypeOf(@abs(rhs)) { return @abs(rhs); } test abs { - const test_abs = unary(abs, .{ .strict = true }); + const test_abs = unary(abs, .{ .compare = .strict }); try test_abs.testInts(); try test_abs.testIntVectors(); try test_abs.testFloats(); try test_abs.testFloatVectors(); } -inline fn clz(comptime Type: type, rhs: Type) @TypeOf(@clz(rhs)) { - return @clz(rhs); +inline fn floor(comptime Type: type, rhs: Type) @TypeOf(@floor(rhs)) { + return @floor(rhs); } -test clz { - const test_clz = unary(clz, .{}); - try test_clz.testInts(); - try test_clz.testIntVectors(); +test floor { + const test_floor = unary(floor, .{ .compare = .strict }); + try test_floor.testFloats(); + try test_floor.testFloatVectors(); +} + +inline fn ceil(comptime Type: type, rhs: Type) @TypeOf(@ceil(rhs)) { + return @ceil(rhs); +} +test ceil { + const test_ceil = unary(ceil, .{ .compare = .strict }); + try test_ceil.testFloats(); + try test_ceil.testFloatVectors(); +} + +inline fn round(comptime Type: type, rhs: Type) @TypeOf(@round(rhs)) { + return @round(rhs); +} +test round { + const test_round = unary(round, .{ .compare = .strict }); + try test_round.testFloats(); + try test_round.testFloatVectors(); +} + +inline fn trunc(comptime Type: type, rhs: Type) @TypeOf(@trunc(rhs)) { + return @trunc(rhs); +} +test trunc { + const test_trunc = unary(trunc, .{ .compare = .strict }); + try test_trunc.testFloats(); + try test_trunc.testFloatVectors(); +} + +inline fn negate(comptime Type: type, rhs: Type) @TypeOf(-rhs) { + return -rhs; +} +test negate { + const test_negate = unary(negate, .{ .compare = .strict }); + try test_negate.testFloats(); + try test_negate.testFloatVectors(); } inline fn intCast(comptime Result: type, comptime Type: type, rhs: Type, comptime ct_rhs: Type) Result { @@ -11407,7 +11672,7 @@ inline fn floatCast(comptime Result: type, comptime Type: type, rhs: Type, compt return @floatCast(rhs); } test floatCast { - const test_float_cast = cast(floatCast, .{ .strict = true }); + const test_float_cast = cast(floatCast, .{ .compare = .strict }); try test_float_cast.testFloats(); try test_float_cast.testFloatVectors(); } @@ -11610,3 +11875,12 @@ test optionalsNotEqual { try test_optionals_not_equal.testInts(); try test_optionals_not_equal.testFloats(); } + +inline fn mulAdd(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(@mulAdd(Type, lhs, rhs, rhs)) { + return @mulAdd(Type, lhs, rhs, rhs); +} +test mulAdd { + const test_mul_add = binary(mulAdd, .{ .compare = .approx }); + try test_mul_add.testFloats(); + try test_mul_add.testFloatVectors(); +}