authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-02-13 05:43:34-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-02-15 03:45:21-05:00
log9f121ec8fb07f20413584068105bee3430be3e70
tree7fb73e195ceaea0f11c87aef97fc798cfb5d758a
parent8159ff8b811a1621674b0f00a01b5a92698af8f9

x86_64: implement unsafe scalar and vector integer add/sub


2 files changed, 2199 insertions(+), 380 deletions(-)

src/arch/x86_64/CodeGen.zig+2162-368
......@@ -2418,7 +2418,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24182418}
24192419
24202420fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2421 @setEvalBranchQuota(11_900);
2421 @setEvalBranchQuota(12_200);
24222422 const pt = cg.pt;
24232423 const zcu = pt.zcu;
24242424 const ip = &zcu.intern_pool;
......@@ -2454,9 +2454,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24542454 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);
24552455 switch (air_tags[@intFromEnum(inst)]) {
24562456 // zig fmt: off
2457 .add_wrap,
2458 .sub_wrap,
2459 => |air_tag| try cg.airBinOp(inst, air_tag),
2457 .add_wrap => try cg.airBinOp(inst, .add_wrap),
2458 .sub_wrap => try cg.airBinOp(inst, .sub_wrap),
24602459
24612460 .shr, .shr_exact => try cg.airShlShrBinOp(inst),
24622461 .shl, .shl_exact => try cg.airShlShrBinOp(inst),
......@@ -2505,24 +2504,127 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
25052504 if (arg != .none) break;
25062505 } else try cg.airDbgVarArgs();
25072506 },
2508 .add, .add_optimized => |air_tag| if (use_old) try cg.airBinOp(inst, .add) else fallback: {
2507 .add, .add_optimized => |air_tag| if (use_old) try cg.airBinOp(inst, .add) else {
25092508 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
2510 if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airBinOp(inst, air_tag);
25112509 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
25122510 var res: [1]Temp = undefined;
25132511 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
2514 .required_features = .{ .f16c, null, null, null },
2512 .src_constraints = .{ .{ .int = .byte }, .{ .int = .byte }, .any },
2513 .patterns = &.{
2514 .{ .src = .{ .mut_mem, .imm8, .none } },
2515 .{ .src = .{ .imm8, .mut_mem, .none }, .commute = .{ 0, 1 } },
2516 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
2517 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2518 .{ .src = .{ .mut_mem, .to_gpr, .none } },
2519 .{ .src = .{ .to_gpr, .mut_mem, .none }, .commute = .{ 0, 1 } },
2520 .{ .src = .{ .to_mut_gpr, .mem, .none } },
2521 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2522 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
2523 },
2524 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2525 .clobbers = .{ .eflags = true },
2526 .each = .{ .once = &.{
2527 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
2528 } },
2529 }, .{
2530 .src_constraints = .{ .{ .int = .word }, .{ .int = .word }, .any },
2531 .patterns = &.{
2532 .{ .src = .{ .mut_mem, .imm16, .none } },
2533 .{ .src = .{ .imm16, .mut_mem, .none }, .commute = .{ 0, 1 } },
2534 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
2535 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2536 .{ .src = .{ .mut_mem, .to_gpr, .none } },
2537 .{ .src = .{ .to_gpr, .mut_mem, .none }, .commute = .{ 0, 1 } },
2538 .{ .src = .{ .to_mut_gpr, .mem, .none } },
2539 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2540 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
2541 },
2542 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2543 .clobbers = .{ .eflags = true },
2544 .each = .{ .once = &.{
2545 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
2546 } },
2547 }, .{
2548 .src_constraints = .{ .{ .int = .dword }, .{ .int = .dword }, .any },
2549 .patterns = &.{
2550 .{ .src = .{ .mut_mem, .imm32, .none } },
2551 .{ .src = .{ .imm32, .mut_mem, .none }, .commute = .{ 0, 1 } },
2552 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
2553 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2554 .{ .src = .{ .mut_mem, .to_gpr, .none } },
2555 .{ .src = .{ .to_gpr, .mut_mem, .none }, .commute = .{ 0, 1 } },
2556 .{ .src = .{ .to_mut_gpr, .mem, .none } },
2557 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2558 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
2559 },
2560 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2561 .clobbers = .{ .eflags = true },
2562 .each = .{ .once = &.{
2563 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
2564 } },
2565 }, .{
2566 .required_features = .{ .@"64bit", null, null, null },
2567 .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword }, .any },
2568 .patterns = &.{
2569 .{ .src = .{ .mut_mem, .simm32, .none } },
2570 .{ .src = .{ .simm32, .mut_mem, .none }, .commute = .{ 0, 1 } },
2571 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
2572 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2573 .{ .src = .{ .mut_mem, .to_gpr, .none } },
2574 .{ .src = .{ .to_gpr, .mut_mem, .none }, .commute = .{ 0, 1 } },
2575 .{ .src = .{ .to_mut_gpr, .mem, .none } },
2576 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
2577 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
2578 },
2579 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2580 .clobbers = .{ .eflags = true },
2581 .each = .{ .once = &.{
2582 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
2583 } },
2584 }, .{
2585 .required_features = .{ .@"64bit", null, null, null },
25152586 .src_constraints = .{
2516 .{ .scalar_float = .{ .of = .word, .is = .word } },
2517 .{ .scalar_float = .{ .of = .word, .is = .word } },
2587 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
2588 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
25182589 .any,
25192590 },
25202591 .patterns = &.{
2521 .{ .src = .{ .to_sse, .to_sse, .none } },
2592 .{ .src = .{ .to_mem, .to_mem, .none } },
25222593 },
25232594 .extra_temps = .{
2524 .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
2595 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2596 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
2597 .unused,
2598 .unused,
2599 .unused,
2600 .unused,
2601 .unused,
2602 .unused,
25252603 .unused,
2604 },
2605 .dst_temps = .{ .mem, .unused },
2606 .clobbers = .{ .eflags = true },
2607 .each = .{ .once = &.{
2608 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
2609 .{ ._, ._c, .cl, ._, ._, ._, ._ },
2610 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
2611 .{ ._, ._, .adc, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
2612 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp1q, ._, ._ },
2613 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
2614 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
2615 } },
2616 }, .{
2617 .src_constraints = .{
2618 .{ .remainder_int = .{ .of = .dword, .is = .dword } },
2619 .{ .remainder_int = .{ .of = .dword, .is = .dword } },
2620 .any,
2621 },
2622 .patterns = &.{
2623 .{ .src = .{ .to_mem, .to_mem, .none } },
2624 },
2625 .extra_temps = .{
2626 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2627 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
25262628 .unused,
25272629 .unused,
25282630 .unused,
......@@ -2531,107 +2633,1823 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
25312633 .unused,
25322634 .unused,
25332635 },
2636 .dst_temps = .{ .mem, .unused },
2637 .clobbers = .{ .eflags = true },
2638 .each = .{ .once = &.{
2639 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_4), ._, ._ },
2640 .{ ._, ._c, .cl, ._, ._, ._, ._ },
2641 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_size), ._, ._ },
2642 .{ ._, ._, .adc, .tmp1d, .memsia(.src1d, .@"4", .tmp0, .add_size), ._, ._ },
2643 .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_size), .tmp1d, ._, ._ },
2644 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
2645 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
2646 } },
2647 }, .{
2648 .required_features = .{ .avx, null, null, null },
2649 .src_constraints = .{
2650 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
2651 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
2652 .any,
2653 },
2654 .patterns = &.{
2655 .{ .src = .{ .to_sse, .mem, .none } },
2656 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2657 .{ .src = .{ .to_sse, .to_sse, .none } },
2658 },
25342659 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
25352660 .each = .{ .once = &.{
2536 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
2537 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
2538 .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0d, ._ },
2539 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
2661 .{ ._, .vp_b, .add, .dst0x, .src0x, .src1x, ._ },
25402662 } },
25412663 }, .{
2542 .required_features = .{ .sse, null, null, null },
2664 .required_features = .{ .sse2, null, null, null },
25432665 .src_constraints = .{
2544 .{ .scalar_float = .{ .of = .word, .is = .word } },
2545 .{ .scalar_float = .{ .of = .word, .is = .word } },
2666 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
2667 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
25462668 .any,
25472669 },
25482670 .patterns = &.{
2549 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } },
2671 .{ .src = .{ .to_mut_sse, .mem, .none } },
2672 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
2673 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
2674 },
2675 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2676 .each = .{ .once = &.{
2677 .{ ._, .p_b, .add, .dst0x, .src1x, ._, ._ },
2678 } },
2679 }, .{
2680 .required_features = .{ .avx2, null, null, null },
2681 .src_constraints = .{
2682 .{ .scalar_int = .{ .of = .yword, .is = .byte } },
2683 .{ .scalar_int = .{ .of = .yword, .is = .byte } },
2684 .any,
2685 },
2686 .patterns = &.{
2687 .{ .src = .{ .to_sse, .mem, .none } },
2688 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2689 .{ .src = .{ .to_sse, .to_sse, .none } },
2690 },
2691 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2692 .each = .{ .once = &.{
2693 .{ ._, .vp_b, .add, .dst0y, .src0y, .src1y, ._ },
2694 } },
2695 }, .{
2696 .required_features = .{ .avx2, null, null, null },
2697 .src_constraints = .{
2698 .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } },
2699 .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } },
2700 .any,
2701 },
2702 .patterns = &.{
2703 .{ .src = .{ .to_mem, .to_mem, .none } },
25502704 },
2551 .call_frame = .{ .alignment = .@"16" },
25522705 .extra_temps = .{
2553 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
2706 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2707 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
2708 .unused,
2709 .unused,
2710 .unused,
2711 .unused,
2712 .unused,
2713 .unused,
2714 .unused,
2715 },
2716 .dst_temps = .{ .mem, .unused },
2717 .each = .{ .once = &.{
2718 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2719 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
2720 .{ ._, .vp_b, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
2721 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
2722 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
2723 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2724 } },
2725 }, .{
2726 .required_features = .{ .avx, null, null, null },
2727 .src_constraints = .{
2728 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2729 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2730 .any,
2731 },
2732 .patterns = &.{
2733 .{ .src = .{ .to_mem, .to_mem, .none } },
2734 },
2735 .extra_temps = .{
2736 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2737 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
2738 .unused,
2739 .unused,
2740 .unused,
2741 .unused,
2742 .unused,
2743 .unused,
2744 .unused,
2745 },
2746 .dst_temps = .{ .mem, .unused },
2747 .each = .{ .once = &.{
2748 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2749 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2750 .{ ._, .vp_b, .add, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
2751 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
2752 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2753 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2754 } },
2755 }, .{
2756 .required_features = .{ .sse2, null, null, null },
2757 .src_constraints = .{
2758 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2759 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2760 .any,
2761 },
2762 .patterns = &.{
2763 .{ .src = .{ .to_mem, .to_mem, .none } },
2764 },
2765 .extra_temps = .{
2766 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2767 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
2768 .unused,
2769 .unused,
2770 .unused,
2771 .unused,
2772 .unused,
2773 .unused,
2774 .unused,
2775 },
2776 .dst_temps = .{ .mem, .unused },
2777 .each = .{ .once = &.{
2778 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2779 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2780 .{ ._, .p_b, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
2781 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
2782 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2783 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2784 } },
2785 }, .{
2786 .required_features = .{ .slow_incdec, null, null, null },
2787 .src_constraints = .{
2788 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2789 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2790 .any,
2791 },
2792 .patterns = &.{
2793 .{ .src = .{ .to_mem, .to_mem, .none } },
2794 },
2795 .extra_temps = .{
2796 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2797 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
2798 .unused,
2799 .unused,
2800 .unused,
25542801 .unused,
25552802 .unused,
25562803 .unused,
25572804 .unused,
2805 },
2806 .dst_temps = .{ .mem, .unused },
2807 .each = .{ .once = &.{
2808 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2809 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
2810 .{ ._, ._, .add, .tmp1b, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._ },
2811 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ },
2812 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
2813 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2814 } },
2815 }, .{
2816 .src_constraints = .{
2817 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2818 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2819 .any,
2820 },
2821 .patterns = &.{
2822 .{ .src = .{ .to_mem, .to_mem, .none } },
2823 },
2824 .extra_temps = .{
2825 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2826 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
2827 .unused,
2828 .unused,
2829 .unused,
25582830 .unused,
25592831 .unused,
25602832 .unused,
25612833 .unused,
25622834 },
2835 .dst_temps = .{ .mem, .unused },
2836 .each = .{ .once = &.{
2837 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2838 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
2839 .{ ._, ._, .add, .tmp1b, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._ },
2840 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ },
2841 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
2842 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
2843 } },
2844 }, .{
2845 .required_features = .{ .avx, null, null, null },
2846 .src_constraints = .{
2847 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2848 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2849 .any,
2850 },
2851 .patterns = &.{
2852 .{ .src = .{ .to_sse, .mem, .none } },
2853 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2854 .{ .src = .{ .to_sse, .to_sse, .none } },
2855 },
2856 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2857 .each = .{ .once = &.{
2858 .{ ._, .vp_w, .add, .dst0x, .src0x, .src1x, ._ },
2859 } },
2860 }, .{
2861 .required_features = .{ .sse2, null, null, null },
2862 .src_constraints = .{
2863 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2864 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2865 .any,
2866 },
2867 .patterns = &.{
2868 .{ .src = .{ .to_mut_sse, .mem, .none } },
2869 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
2870 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
2871 },
25632872 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2564 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
25652873 .each = .{ .once = &.{
2566 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
2874 .{ ._, .p_w, .add, .dst0x, .src1x, ._, ._ },
25672875 } },
25682876 }, .{
2569 .required_features = .{ .f16c, null, null, null },
2877 .required_features = .{ .avx2, null, null, null },
25702878 .src_constraints = .{
2571 .{ .scalar_float = .{ .of = .qword, .is = .word } },
2572 .{ .scalar_float = .{ .of = .qword, .is = .word } },
2879 .{ .scalar_int = .{ .of = .yword, .is = .word } },
2880 .{ .scalar_int = .{ .of = .yword, .is = .word } },
25732881 .any,
25742882 },
25752883 .patterns = &.{
2576 .{ .src = .{ .mem, .mem, .none } },
25772884 .{ .src = .{ .to_sse, .mem, .none } },
2578 .{ .src = .{ .mem, .to_sse, .none } },
2885 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
25792886 .{ .src = .{ .to_sse, .to_sse, .none } },
25802887 },
2888 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2889 .each = .{ .once = &.{
2890 .{ ._, .vp_w, .add, .dst0y, .src0y, .src1y, ._ },
2891 } },
2892 }, .{
2893 .required_features = .{ .avx2, null, null, null },
2894 .src_constraints = .{
2895 .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } },
2896 .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } },
2897 .any,
2898 },
2899 .patterns = &.{
2900 .{ .src = .{ .to_mem, .to_mem, .none } },
2901 },
25812902 .extra_temps = .{
2582 .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
2903 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2904 .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } },
2905 .unused,
2906 .unused,
2907 .unused,
2908 .unused,
2909 .unused,
2910 .unused,
2911 .unused,
2912 },
2913 .dst_temps = .{ .mem, .unused },
2914 .each = .{ .once = &.{
2915 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2916 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
2917 .{ ._, .vp_w, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
2918 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
2919 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
2920 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2921 } },
2922 }, .{
2923 .required_features = .{ .avx, null, null, null },
2924 .src_constraints = .{
2925 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2926 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2927 .any,
2928 },
2929 .patterns = &.{
2930 .{ .src = .{ .to_mem, .to_mem, .none } },
2931 },
2932 .extra_temps = .{
2933 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2934 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
2935 .unused,
2936 .unused,
2937 .unused,
2938 .unused,
2939 .unused,
2940 .unused,
2941 .unused,
2942 },
2943 .dst_temps = .{ .mem, .unused },
2944 .each = .{ .once = &.{
2945 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2946 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2947 .{ ._, .vp_w, .add, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
2948 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
2949 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2950 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2951 } },
2952 }, .{
2953 .required_features = .{ .sse2, null, null, null },
2954 .src_constraints = .{
2955 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2956 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2957 .any,
2958 },
2959 .patterns = &.{
2960 .{ .src = .{ .to_mem, .to_mem, .none } },
2961 },
2962 .extra_temps = .{
2963 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2964 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
2965 .unused,
25832966 .unused,
25842967 .unused,
25852968 .unused,
25862969 .unused,
25872970 .unused,
25882971 .unused,
2972 },
2973 .dst_temps = .{ .mem, .unused },
2974 .each = .{ .once = &.{
2975 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2976 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2977 .{ ._, .p_w, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
2978 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
2979 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2980 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2981 } },
2982 }, .{
2983 .src_constraints = .{
2984 .{ .multiple_scalar_int = .{ .of = .word, .is = .word } },
2985 .{ .multiple_scalar_int = .{ .of = .word, .is = .word } },
2986 .any,
2987 },
2988 .patterns = &.{
2989 .{ .src = .{ .to_mem, .to_mem, .none } },
2990 },
2991 .extra_temps = .{
2992 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2993 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
2994 .unused,
2995 .unused,
2996 .unused,
2997 .unused,
2998 .unused,
25892999 .unused,
25903000 .unused,
25913001 },
3002 .dst_temps = .{ .mem, .unused },
3003 .each = .{ .once = &.{
3004 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3005 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ },
3006 .{ ._, ._, .add, .tmp1w, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ },
3007 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ },
3008 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3009 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3010 } },
3011 }, .{
3012 .required_features = .{ .avx, null, null, null },
3013 .src_constraints = .{
3014 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3015 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3016 .any,
3017 },
3018 .patterns = &.{
3019 .{ .src = .{ .to_sse, .mem, .none } },
3020 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3021 .{ .src = .{ .to_sse, .to_sse, .none } },
3022 },
25923023 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
25933024 .each = .{ .once = &.{
2594 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
2595 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
2596 .{ ._, .v_ps, .add, .dst0x, .dst0x, .tmp0x, ._ },
2597 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
3025 .{ ._, .vp_d, .add, .dst0x, .src0x, .src1x, ._ },
25983026 } },
25993027 }, .{
2600 .required_features = .{ .f16c, null, null, null },
3028 .required_features = .{ .sse2, null, null, null },
26013029 .src_constraints = .{
2602 .{ .scalar_float = .{ .of = .xword, .is = .word } },
2603 .{ .scalar_float = .{ .of = .xword, .is = .word } },
3030 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3031 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3032 .any,
3033 },
3034 .patterns = &.{
3035 .{ .src = .{ .to_mut_sse, .mem, .none } },
3036 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
3037 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
3038 },
3039 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3040 .each = .{ .once = &.{
3041 .{ ._, .p_d, .add, .dst0x, .src1x, ._, ._ },
3042 } },
3043 }, .{
3044 .required_features = .{ .avx2, null, null, null },
3045 .src_constraints = .{
3046 .{ .scalar_int = .{ .of = .yword, .is = .dword } },
3047 .{ .scalar_int = .{ .of = .yword, .is = .dword } },
3048 .any,
3049 },
3050 .patterns = &.{
3051 .{ .src = .{ .to_sse, .mem, .none } },
3052 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3053 .{ .src = .{ .to_sse, .to_sse, .none } },
3054 },
3055 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3056 .each = .{ .once = &.{
3057 .{ ._, .vp_d, .add, .dst0y, .src0y, .src1y, ._ },
3058 } },
3059 }, .{
3060 .required_features = .{ .avx2, null, null, null },
3061 .src_constraints = .{
3062 .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } },
3063 .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } },
3064 .any,
3065 },
3066 .patterns = &.{
3067 .{ .src = .{ .to_mem, .to_mem, .none } },
3068 },
3069 .extra_temps = .{
3070 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3071 .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } },
3072 .unused,
3073 .unused,
3074 .unused,
3075 .unused,
3076 .unused,
3077 .unused,
3078 .unused,
3079 },
3080 .dst_temps = .{ .mem, .unused },
3081 .each = .{ .once = &.{
3082 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3083 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
3084 .{ ._, .vp_d, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
3085 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
3086 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3087 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3088 } },
3089 }, .{
3090 .required_features = .{ .avx, null, null, null },
3091 .src_constraints = .{
3092 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3093 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3094 .any,
3095 },
3096 .patterns = &.{
3097 .{ .src = .{ .to_mem, .to_mem, .none } },
3098 },
3099 .extra_temps = .{
3100 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3101 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
3102 .unused,
3103 .unused,
3104 .unused,
3105 .unused,
3106 .unused,
3107 .unused,
3108 .unused,
3109 },
3110 .dst_temps = .{ .mem, .unused },
3111 .each = .{ .once = &.{
3112 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3113 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3114 .{ ._, .vp_d, .add, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
3115 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3116 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3117 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3118 } },
3119 }, .{
3120 .required_features = .{ .sse2, null, null, null },
3121 .src_constraints = .{
3122 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3123 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3124 .any,
3125 },
3126 .patterns = &.{
3127 .{ .src = .{ .to_mem, .to_mem, .none } },
3128 },
3129 .extra_temps = .{
3130 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3131 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
3132 .unused,
3133 .unused,
3134 .unused,
3135 .unused,
3136 .unused,
3137 .unused,
3138 .unused,
3139 },
3140 .dst_temps = .{ .mem, .unused },
3141 .each = .{ .once = &.{
3142 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3143 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3144 .{ ._, .p_d, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3145 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3146 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3147 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3148 } },
3149 }, .{
3150 .src_constraints = .{
3151 .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } },
3152 .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } },
3153 .any,
3154 },
3155 .patterns = &.{
3156 .{ .src = .{ .to_mem, .to_mem, .none } },
3157 },
3158 .extra_temps = .{
3159 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3160 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3161 .unused,
3162 .unused,
3163 .unused,
3164 .unused,
3165 .unused,
3166 .unused,
3167 .unused,
3168 },
3169 .dst_temps = .{ .mem, .unused },
3170 .each = .{ .once = &.{
3171 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3172 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ },
3173 .{ ._, ._, .add, .tmp1d, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ },
3174 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ },
3175 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
3176 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3177 } },
3178 }, .{
3179 .required_features = .{ .avx, null, null, null },
3180 .src_constraints = .{
3181 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
3182 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
3183 .any,
3184 },
3185 .patterns = &.{
3186 .{ .src = .{ .to_sse, .mem, .none } },
3187 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3188 .{ .src = .{ .to_sse, .to_sse, .none } },
3189 },
3190 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3191 .each = .{ .once = &.{
3192 .{ ._, .vp_q, .add, .dst0x, .src0x, .src1x, ._ },
3193 } },
3194 }, .{
3195 .required_features = .{ .sse2, null, null, null },
3196 .src_constraints = .{
3197 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
3198 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
3199 .any,
3200 },
3201 .patterns = &.{
3202 .{ .src = .{ .to_mut_sse, .mem, .none } },
3203 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
3204 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
3205 },
3206 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3207 .each = .{ .once = &.{
3208 .{ ._, .p_q, .add, .dst0x, .src1x, ._, ._ },
3209 } },
3210 }, .{
3211 .required_features = .{ .avx2, null, null, null },
3212 .src_constraints = .{
3213 .{ .scalar_int = .{ .of = .yword, .is = .qword } },
3214 .{ .scalar_int = .{ .of = .yword, .is = .qword } },
3215 .any,
3216 },
3217 .patterns = &.{
3218 .{ .src = .{ .to_sse, .mem, .none } },
3219 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3220 .{ .src = .{ .to_sse, .to_sse, .none } },
3221 },
3222 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3223 .each = .{ .once = &.{
3224 .{ ._, .vp_q, .add, .dst0y, .src0y, .src1y, ._ },
3225 } },
3226 }, .{
3227 .required_features = .{ .avx2, null, null, null },
3228 .src_constraints = .{
3229 .{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } },
3230 .{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } },
3231 .any,
3232 },
3233 .patterns = &.{
3234 .{ .src = .{ .to_mem, .to_mem, .none } },
3235 },
3236 .extra_temps = .{
3237 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3238 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
3239 .unused,
3240 .unused,
3241 .unused,
3242 .unused,
3243 .unused,
3244 .unused,
3245 .unused,
3246 },
3247 .dst_temps = .{ .mem, .unused },
3248 .each = .{ .once = &.{
3249 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3250 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
3251 .{ ._, .vp_q, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
3252 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
3253 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3254 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3255 } },
3256 }, .{
3257 .required_features = .{ .avx, null, null, null },
3258 .src_constraints = .{
3259 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3260 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3261 .any,
3262 },
3263 .patterns = &.{
3264 .{ .src = .{ .to_mem, .to_mem, .none } },
3265 },
3266 .extra_temps = .{
3267 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3268 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
3269 .unused,
3270 .unused,
3271 .unused,
3272 .unused,
3273 .unused,
3274 .unused,
3275 .unused,
3276 },
3277 .dst_temps = .{ .mem, .unused },
3278 .each = .{ .once = &.{
3279 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3280 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3281 .{ ._, .vp_q, .add, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
3282 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3283 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3284 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3285 } },
3286 }, .{
3287 .required_features = .{ .sse2, null, null, null },
3288 .src_constraints = .{
3289 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3290 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3291 .any,
3292 },
3293 .patterns = &.{
3294 .{ .src = .{ .to_mem, .to_mem, .none } },
3295 },
3296 .extra_temps = .{
3297 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3298 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
3299 .unused,
3300 .unused,
3301 .unused,
3302 .unused,
3303 .unused,
3304 .unused,
3305 .unused,
3306 },
3307 .dst_temps = .{ .mem, .unused },
3308 .each = .{ .once = &.{
3309 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3310 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3311 .{ ._, .p_q, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3312 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3313 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3314 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3315 } },
3316 }, .{
3317 .required_features = .{ .@"64bit", null, null, null },
3318 .src_constraints = .{
3319 .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } },
3320 .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } },
3321 .any,
3322 },
3323 .patterns = &.{
3324 .{ .src = .{ .to_mem, .to_mem, .none } },
3325 },
3326 .extra_temps = .{
3327 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3328 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
3329 .unused,
3330 .unused,
3331 .unused,
3332 .unused,
3333 .unused,
3334 .unused,
3335 .unused,
3336 },
3337 .dst_temps = .{ .mem, .unused },
3338 .each = .{ .once = &.{
3339 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3340 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ },
3341 .{ ._, ._, .add, .tmp1q, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ },
3342 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ },
3343 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
3344 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3345 } },
3346 }, .{
3347 .required_features = .{ .@"64bit", null, null, null },
3348 .src_constraints = .{
3349 .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } },
3350 .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } },
3351 .any,
3352 },
3353 .patterns = &.{
3354 .{ .src = .{ .to_mem, .to_mem, .none } },
3355 },
3356 .extra_temps = .{
3357 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3358 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3359 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3360 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3361 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3362 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
3363 .unused,
3364 .unused,
3365 .unused,
3366 },
3367 .dst_temps = .{ .mem, .unused },
3368 .each = .{ .once = &.{
3369 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3370 .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_add_elem_size), ._, ._ },
3371 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_add_elem_size), ._, ._ },
3372 .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size_add_elem_size), ._, ._ },
3373 .{ ._, ._, .mov, .tmp4p, .sa(.src0, .sub_elem_size_div_8), ._, ._ },
3374 .{ ._, ._c, .cl, ._, ._, ._, ._ },
3375 .{ .@"1:", ._, .mov, .tmp5q, .leasi(.tmp1q, .@"8", .tmp4), ._, ._ },
3376 .{ ._, ._, .adc, .tmp5q, .leasi(.tmp2q, .@"8", .tmp4), ._, ._ },
3377 .{ ._, ._, .mov, .leasi(.tmp3q, .@"8", .tmp4), .tmp5q, ._, ._ },
3378 .{ ._, ._c, .in, .tmp4p, ._, ._, ._ },
3379 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
3380 .{ ._, ._, .add, .tmp0p, .sa(.src0, .add_elem_size), ._, ._ },
3381 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3382 } },
3383 }, .{
3384 .src_constraints = .{
3385 .{ .scalar_remainder_int = .{ .of = .dword, .is = .dword } },
3386 .{ .scalar_remainder_int = .{ .of = .dword, .is = .dword } },
3387 .any,
3388 },
3389 .patterns = &.{
3390 .{ .src = .{ .to_mem, .to_mem, .none } },
3391 },
3392 .extra_temps = .{
3393 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3394 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3395 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3396 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3397 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3398 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3399 .unused,
3400 .unused,
3401 .unused,
3402 },
3403 .dst_temps = .{ .mem, .unused },
3404 .each = .{ .once = &.{
3405 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3406 .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_add_elem_size), ._, ._ },
3407 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_add_elem_size), ._, ._ },
3408 .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size_add_elem_size), ._, ._ },
3409 .{ ._, ._, .mov, .tmp4p, .sa(.src0, .sub_elem_size_div_4), ._, ._ },
3410 .{ ._, ._c, .cl, ._, ._, ._, ._ },
3411 .{ .@"1:", ._, .mov, .tmp5d, .leasi(.tmp1d, .@"4", .tmp4), ._, ._ },
3412 .{ ._, ._, .adc, .tmp5d, .leasi(.tmp2d, .@"4", .tmp4), ._, ._ },
3413 .{ ._, ._, .mov, .leasi(.tmp3d, .@"4", .tmp4), .tmp5d, ._, ._ },
3414 .{ ._, ._c, .in, .tmp4p, ._, ._, ._ },
3415 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
3416 .{ ._, ._, .add, .tmp0p, .sa(.src0, .add_elem_size), ._, ._ },
3417 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3418 } },
3419 }, .{
3420 .required_features = .{ .f16c, null, null, null },
3421 .src_constraints = .{
3422 .{ .scalar_float = .{ .of = .word, .is = .word } },
3423 .{ .scalar_float = .{ .of = .word, .is = .word } },
3424 .any,
3425 },
3426 .patterns = &.{
3427 .{ .src = .{ .to_sse, .to_sse, .none } },
3428 },
3429 .extra_temps = .{
3430 .{ .type = .f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
3431 .unused,
3432 .unused,
3433 .unused,
3434 .unused,
3435 .unused,
3436 .unused,
3437 .unused,
3438 .unused,
3439 },
3440 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3441 .each = .{ .once = &.{
3442 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
3443 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
3444 .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0d, ._ },
3445 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
3446 } },
3447 }, .{
3448 .required_features = .{ .sse, null, null, null },
3449 .src_constraints = .{
3450 .{ .scalar_float = .{ .of = .word, .is = .word } },
3451 .{ .scalar_float = .{ .of = .word, .is = .word } },
3452 .any,
3453 },
3454 .patterns = &.{
3455 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } },
3456 },
3457 .call_frame = .{ .alignment = .@"16" },
3458 .extra_temps = .{
3459 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
3460 .unused,
3461 .unused,
3462 .unused,
3463 .unused,
3464 .unused,
3465 .unused,
3466 .unused,
3467 .unused,
3468 },
3469 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3470 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3471 .each = .{ .once = &.{
3472 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
3473 } },
3474 }, .{
3475 .required_features = .{ .f16c, null, null, null },
3476 .src_constraints = .{
3477 .{ .scalar_float = .{ .of = .qword, .is = .word } },
3478 .{ .scalar_float = .{ .of = .qword, .is = .word } },
3479 .any,
3480 },
3481 .patterns = &.{
3482 .{ .src = .{ .mem, .mem, .none } },
3483 .{ .src = .{ .to_sse, .mem, .none } },
3484 .{ .src = .{ .mem, .to_sse, .none } },
3485 .{ .src = .{ .to_sse, .to_sse, .none } },
3486 },
3487 .extra_temps = .{
3488 .{ .type = .vector_4_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
3489 .unused,
3490 .unused,
3491 .unused,
3492 .unused,
3493 .unused,
3494 .unused,
3495 .unused,
3496 .unused,
3497 },
3498 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3499 .each = .{ .once = &.{
3500 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
3501 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
3502 .{ ._, .v_ps, .add, .dst0x, .dst0x, .tmp0x, ._ },
3503 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
3504 } },
3505 }, .{
3506 .required_features = .{ .f16c, null, null, null },
3507 .src_constraints = .{
3508 .{ .scalar_float = .{ .of = .xword, .is = .word } },
3509 .{ .scalar_float = .{ .of = .xword, .is = .word } },
3510 .any,
3511 },
3512 .patterns = &.{
3513 .{ .src = .{ .mem, .mem, .none } },
3514 .{ .src = .{ .to_sse, .mem, .none } },
3515 .{ .src = .{ .mem, .to_sse, .none } },
3516 .{ .src = .{ .to_sse, .to_sse, .none } },
3517 },
3518 .extra_temps = .{
3519 .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
3520 .unused,
3521 .unused,
3522 .unused,
3523 .unused,
3524 .unused,
3525 .unused,
3526 .unused,
3527 .unused,
3528 },
3529 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3530 .each = .{ .once = &.{
3531 .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ },
3532 .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ },
3533 .{ ._, .v_ps, .add, .dst0y, .dst0y, .tmp0y, ._ },
3534 .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ },
3535 } },
3536 }, .{
3537 .required_features = .{ .f16c, null, null, null },
3538 .src_constraints = .{
3539 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
3540 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
3541 .any,
3542 },
3543 .patterns = &.{
3544 .{ .src = .{ .to_mem, .to_mem, .none } },
3545 },
3546 .extra_temps = .{
3547 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3548 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
3549 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
3550 .unused,
3551 .unused,
3552 .unused,
3553 .unused,
3554 .unused,
3555 .unused,
3556 },
3557 .dst_temps = .{ .mem, .unused },
3558 .clobbers = .{ .eflags = true },
3559 .each = .{ .once = &.{
3560 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3561 .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3562 .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3563 .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .tmp2y, ._ },
3564 .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ },
3565 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3566 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3567 } },
3568 }, .{
3569 .required_features = .{ .avx, null, null, null },
3570 .src_constraints = .{
3571 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3572 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3573 .any,
3574 },
3575 .patterns = &.{
3576 .{ .src = .{ .to_mem, .to_mem, .none } },
3577 },
3578 .call_frame = .{ .alignment = .@"16" },
3579 .extra_temps = .{
3580 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3581 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
3582 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
3583 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
3584 .unused,
3585 .unused,
3586 .unused,
3587 .unused,
3588 .unused,
3589 },
3590 .dst_temps = .{ .mem, .unused },
3591 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3592 .each = .{ .once = &.{
3593 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3594 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
3595 .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) },
3596 .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) },
3597 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
3598 .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ },
3599 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3600 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3601 } },
3602 }, .{
3603 .required_features = .{ .sse4_1, null, null, null },
3604 .src_constraints = .{
3605 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3606 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3607 .any,
3608 },
3609 .patterns = &.{
3610 .{ .src = .{ .to_mem, .to_mem, .none } },
3611 },
3612 .call_frame = .{ .alignment = .@"16" },
3613 .extra_temps = .{
3614 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3615 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
3616 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
3617 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
3618 .unused,
3619 .unused,
3620 .unused,
3621 .unused,
3622 .unused,
3623 },
3624 .dst_temps = .{ .mem, .unused },
3625 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3626 .each = .{ .once = &.{
3627 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3628 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
3629 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
3630 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },
3631 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ },
3632 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
3633 .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ },
3634 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3635 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3636 } },
3637 }, .{
3638 .required_features = .{ .sse2, null, null, null },
3639 .src_constraints = .{
3640 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3641 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3642 .any,
3643 },
3644 .patterns = &.{
3645 .{ .src = .{ .to_mem, .to_mem, .none } },
3646 },
3647 .call_frame = .{ .alignment = .@"16" },
3648 .extra_temps = .{
3649 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3650 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
3651 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
3652 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
3653 .{ .type = .f16, .kind = .{ .reg = .ax } },
3654 .unused,
3655 .unused,
3656 .unused,
3657 .unused,
3658 },
3659 .dst_temps = .{ .mem, .unused },
3660 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3661 .each = .{ .once = &.{
3662 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3663 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
3664 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
3665 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },
3666 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ },
3667 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
3668 .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ },
3669 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ },
3670 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3671 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3672 } },
3673 }, .{
3674 .required_features = .{ .sse, null, null, null },
3675 .src_constraints = .{
3676 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3677 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
3678 .any,
3679 },
3680 .patterns = &.{
3681 .{ .src = .{ .to_mem, .to_mem, .none } },
3682 },
3683 .call_frame = .{ .alignment = .@"16" },
3684 .extra_temps = .{
3685 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3686 .{ .type = .f16, .kind = .{ .reg = .ax } },
3687 .{ .type = .f32, .kind = .mem },
3688 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
3689 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
3690 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
3691 .unused,
3692 .unused,
3693 .unused,
3694 },
3695 .dst_temps = .{ .mem, .unused },
3696 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3697 .each = .{ .once = &.{
3698 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3699 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ },
3700 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
3701 .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ },
3702 .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ },
3703 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
3704 .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ },
3705 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
3706 .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ },
3707 .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ },
3708 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ },
3709 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
3710 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3711 } },
3712 }, .{
3713 .required_features = .{ .avx, null, null, null },
3714 .src_constraints = .{
3715 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
3716 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
3717 .any,
3718 },
3719 .patterns = &.{
3720 .{ .src = .{ .to_sse, .mem, .none } },
3721 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3722 .{ .src = .{ .to_sse, .to_sse, .none } },
3723 },
3724 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3725 .each = .{ .once = &.{
3726 .{ ._, .v_ss, .add, .dst0x, .src0x, .src1d, ._ },
3727 } },
3728 }, .{
3729 .required_features = .{ .sse, null, null, null },
3730 .src_constraints = .{
3731 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
3732 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
3733 .any,
3734 },
3735 .patterns = &.{
3736 .{ .src = .{ .to_mut_sse, .mem, .none } },
3737 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
3738 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
3739 },
3740 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3741 .each = .{ .once = &.{
3742 .{ ._, ._ss, .add, .dst0x, .src1d, ._, ._ },
3743 } },
3744 }, .{
3745 .required_features = .{ .avx, null, null, null },
3746 .src_constraints = .{
3747 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
3748 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
3749 .any,
3750 },
3751 .patterns = &.{
3752 .{ .src = .{ .to_sse, .mem, .none } },
3753 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3754 .{ .src = .{ .to_sse, .to_sse, .none } },
3755 },
3756 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3757 .each = .{ .once = &.{
3758 .{ ._, .v_ps, .add, .dst0x, .src0x, .src1x, ._ },
3759 } },
3760 }, .{
3761 .required_features = .{ .sse, null, null, null },
3762 .src_constraints = .{
3763 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
3764 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
3765 .any,
3766 },
3767 .patterns = &.{
3768 .{ .src = .{ .to_mut_sse, .mem, .none } },
3769 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
3770 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
3771 },
3772 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3773 .each = .{ .once = &.{
3774 .{ ._, ._ps, .add, .dst0x, .src1x, ._, ._ },
3775 } },
3776 }, .{
3777 .required_features = .{ .avx, null, null, null },
3778 .src_constraints = .{
3779 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
3780 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
3781 .any,
3782 },
3783 .patterns = &.{
3784 .{ .src = .{ .to_sse, .mem, .none } },
3785 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3786 .{ .src = .{ .to_sse, .to_sse, .none } },
3787 },
3788 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3789 .each = .{ .once = &.{
3790 .{ ._, .v_ps, .add, .dst0y, .src0y, .src1y, ._ },
3791 } },
3792 }, .{
3793 .required_features = .{ .avx, null, null, null },
3794 .src_constraints = .{
3795 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
3796 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
3797 .any,
3798 },
3799 .patterns = &.{
3800 .{ .src = .{ .to_mem, .to_mem, .none } },
3801 },
3802 .extra_temps = .{
3803 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3804 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
3805 .unused,
3806 .unused,
3807 .unused,
3808 .unused,
3809 .unused,
3810 .unused,
3811 .unused,
3812 },
3813 .dst_temps = .{ .mem, .unused },
3814 .clobbers = .{ .eflags = true },
3815 .each = .{ .once = &.{
3816 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3817 .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
3818 .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
3819 .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
3820 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3821 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3822 } },
3823 }, .{
3824 .required_features = .{ .sse, null, null, null },
3825 .src_constraints = .{
3826 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
3827 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
3828 .any,
3829 },
3830 .patterns = &.{
3831 .{ .src = .{ .to_mem, .to_mem, .none } },
3832 },
3833 .extra_temps = .{
3834 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3835 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
3836 .unused,
3837 .unused,
3838 .unused,
3839 .unused,
3840 .unused,
3841 .unused,
3842 .unused,
3843 },
3844 .dst_temps = .{ .mem, .unused },
3845 .clobbers = .{ .eflags = true },
3846 .each = .{ .once = &.{
3847 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3848 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3849 .{ ._, ._ps, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3850 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3851 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3852 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3853 } },
3854 }, .{
3855 .required_features = .{ .avx, null, null, null },
3856 .src_constraints = .{
3857 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
3858 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
3859 .any,
3860 },
3861 .patterns = &.{
3862 .{ .src = .{ .to_sse, .mem, .none } },
3863 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3864 .{ .src = .{ .to_sse, .to_sse, .none } },
3865 },
3866 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3867 .each = .{ .once = &.{
3868 .{ ._, .v_sd, .add, .dst0x, .src0x, .src1q, ._ },
3869 } },
3870 }, .{
3871 .required_features = .{ .sse2, null, null, null },
3872 .src_constraints = .{
3873 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
3874 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
3875 .any,
3876 },
3877 .patterns = &.{
3878 .{ .src = .{ .to_mut_sse, .mem, .none } },
3879 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
3880 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
3881 },
3882 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3883 .each = .{ .once = &.{
3884 .{ ._, ._sd, .add, .dst0x, .src1q, ._, ._ },
3885 } },
3886 }, .{
3887 .required_features = .{ .x87, null, null, null },
3888 .src_constraints = .{
3889 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
3890 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
3891 .any,
3892 },
3893 .patterns = &.{
3894 .{ .src = .{ .to_mem, .to_mem, .none } },
3895 },
3896 .extra_temps = .{
3897 .{ .type = .f64, .kind = .{ .reg = .st6 } },
3898 .{ .type = .f64, .kind = .{ .reg = .st7 } },
3899 .unused,
3900 .unused,
3901 .unused,
3902 .unused,
3903 .unused,
3904 .unused,
3905 .unused,
3906 },
3907 .dst_temps = .{ .mem, .unused },
3908 .each = .{ .once = &.{
3909 .{ ._, .f_, .ld, .src0q, ._, ._, ._ },
3910 .{ ._, .f_, .add, .src1q, ._, ._, ._ },
3911 .{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
3912 } },
3913 }, .{
3914 .required_features = .{ .avx, null, null, null },
3915 .src_constraints = .{
3916 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
3917 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
3918 .any,
3919 },
3920 .patterns = &.{
3921 .{ .src = .{ .to_sse, .mem, .none } },
3922 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3923 .{ .src = .{ .to_sse, .to_sse, .none } },
3924 },
3925 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3926 .each = .{ .once = &.{
3927 .{ ._, .v_pd, .add, .dst0x, .src0x, .src1x, ._ },
3928 } },
3929 }, .{
3930 .required_features = .{ .sse2, null, null, null },
3931 .src_constraints = .{
3932 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
3933 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
3934 .any,
3935 },
3936 .patterns = &.{
3937 .{ .src = .{ .to_mut_sse, .mem, .none } },
3938 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
3939 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
3940 },
3941 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3942 .each = .{ .once = &.{
3943 .{ ._, ._pd, .add, .dst0x, .src1x, ._, ._ },
3944 } },
3945 }, .{
3946 .required_features = .{ .avx, null, null, null },
3947 .src_constraints = .{
3948 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
3949 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
3950 .any,
3951 },
3952 .patterns = &.{
3953 .{ .src = .{ .to_sse, .mem, .none } },
3954 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3955 .{ .src = .{ .to_sse, .to_sse, .none } },
3956 },
3957 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3958 .each = .{ .once = &.{
3959 .{ ._, .v_pd, .add, .dst0y, .src0y, .src1y, ._ },
3960 } },
3961 }, .{
3962 .required_features = .{ .avx, null, null, null },
3963 .src_constraints = .{
3964 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
3965 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
3966 .any,
3967 },
3968 .patterns = &.{
3969 .{ .src = .{ .to_mem, .to_mem, .none } },
3970 },
3971 .extra_temps = .{
3972 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3973 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
3974 .unused,
3975 .unused,
3976 .unused,
3977 .unused,
3978 .unused,
3979 .unused,
3980 .unused,
3981 },
3982 .dst_temps = .{ .mem, .unused },
3983 .clobbers = .{ .eflags = true },
3984 .each = .{ .once = &.{
3985 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3986 .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
3987 .{ ._, .v_pd, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
3988 .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
3989 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3990 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3991 } },
3992 }, .{
3993 .required_features = .{ .sse2, null, null, null },
3994 .src_constraints = .{
3995 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
3996 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
3997 .any,
3998 },
3999 .patterns = &.{
4000 .{ .src = .{ .to_mem, .to_mem, .none } },
4001 },
4002 .extra_temps = .{
4003 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4004 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
4005 .unused,
4006 .unused,
4007 .unused,
4008 .unused,
4009 .unused,
4010 .unused,
4011 .unused,
4012 },
4013 .dst_temps = .{ .mem, .unused },
4014 .clobbers = .{ .eflags = true },
4015 .each = .{ .once = &.{
4016 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4017 .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4018 .{ ._, ._pd, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
4019 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4020 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4021 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4022 } },
4023 }, .{
4024 .required_features = .{ .x87, null, null, null },
4025 .src_constraints = .{
4026 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
4027 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
4028 .any,
4029 },
4030 .patterns = &.{
4031 .{ .src = .{ .to_mem, .to_mem, .none } },
4032 },
4033 .extra_temps = .{
4034 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4035 .{ .type = .f64, .kind = .{ .reg = .st6 } },
4036 .{ .type = .f64, .kind = .{ .reg = .st7 } },
4037 .unused,
4038 .unused,
4039 .unused,
4040 .unused,
4041 .unused,
4042 .unused,
4043 },
4044 .dst_temps = .{ .mem, .unused },
4045 .each = .{ .once = &.{
4046 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4047 .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ },
4048 .{ ._, .f_, .add, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._, ._ },
4049 .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ },
4050 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
4051 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4052 } },
4053 }, .{
4054 .required_features = .{ .x87, null, null, null },
4055 .src_constraints = .{
4056 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
4057 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
4058 .any,
4059 },
4060 .patterns = &.{
4061 .{ .src = .{ .mem, .mem, .none } },
4062 },
4063 .extra_temps = .{
4064 .{ .type = .f80, .kind = .{ .reg = .st6 } },
4065 .{ .type = .f80, .kind = .{ .reg = .st7 } },
4066 .unused,
4067 .unused,
4068 .unused,
4069 .unused,
4070 .unused,
4071 .unused,
4072 .unused,
4073 },
4074 .dst_temps = .{ .{ .rc = .x87 }, .unused },
4075 .each = .{ .once = &.{
4076 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
4077 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
4078 .{ ._, .f_p, .add, ._, ._, ._, ._ },
4079 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
4080 } },
4081 }, .{
4082 .required_features = .{ .x87, null, null, null },
4083 .src_constraints = .{
4084 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
4085 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
4086 .any,
4087 },
4088 .patterns = &.{
4089 .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } },
4090 .{ .src = .{ .mem, .to_x87, .none } },
4091 .{ .src = .{ .to_x87, .to_x87, .none } },
4092 },
4093 .extra_temps = .{
4094 .{ .type = .f80, .kind = .{ .reg = .st7 } },
4095 .unused,
4096 .unused,
4097 .unused,
4098 .unused,
4099 .unused,
4100 .unused,
4101 .unused,
4102 .unused,
4103 },
4104 .dst_temps = .{ .{ .rc = .x87 }, .unused },
4105 .each = .{ .once = &.{
4106 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
4107 .{ ._, .f_, .add, .tmp0t, .src1t, ._, ._ },
4108 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
4109 } },
4110 }, .{
4111 .required_features = .{ .x87, null, null, null },
4112 .src_constraints = .{
4113 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
4114 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
4115 .any,
4116 },
4117 .patterns = &.{
4118 .{ .src = .{ .to_mem, .to_mem, .none } },
4119 },
4120 .extra_temps = .{
4121 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4122 .{ .type = .f80, .kind = .{ .reg = .st6 } },
4123 .{ .type = .f80, .kind = .{ .reg = .st7 } },
4124 .unused,
4125 .unused,
4126 .unused,
4127 .unused,
4128 .unused,
4129 .unused,
4130 },
4131 .dst_temps = .{ .mem, .unused },
4132 .each = .{ .once = &.{
4133 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4134 .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ },
4135 .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ },
4136 .{ ._, .f_p, .add, ._, ._, ._, ._ },
4137 .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ },
4138 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4139 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4140 } },
4141 }, .{
4142 .required_features = .{ .sse, null, null, null },
4143 .src_constraints = .{
4144 .{ .scalar_float = .{ .of = .xword, .is = .xword } },
4145 .{ .scalar_float = .{ .of = .xword, .is = .xword } },
4146 .any,
4147 },
4148 .patterns = &.{
4149 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } },
4150 },
4151 .call_frame = .{ .alignment = .@"16" },
4152 .extra_temps = .{
4153 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
4154 .unused,
4155 .unused,
4156 .unused,
4157 .unused,
4158 .unused,
4159 .unused,
4160 .unused,
4161 .unused,
4162 },
4163 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4164 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
4165 .each = .{ .once = &.{
4166 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
4167 } },
4168 }, .{
4169 .required_features = .{ .avx, null, null, null },
4170 .src_constraints = .{
4171 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
4172 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
4173 .any,
4174 },
4175 .patterns = &.{
4176 .{ .src = .{ .to_mem, .to_mem, .none } },
4177 },
4178 .call_frame = .{ .alignment = .@"16" },
4179 .extra_temps = .{
4180 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4181 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
4182 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
4183 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
4184 .unused,
4185 .unused,
4186 .unused,
4187 .unused,
4188 .unused,
4189 },
4190 .dst_temps = .{ .mem, .unused },
4191 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
4192 .each = .{ .once = &.{
4193 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4194 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4195 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
4196 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
4197 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4198 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4199 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4200 } },
4201 }, .{
4202 .required_features = .{ .sse2, null, null, null },
4203 .src_constraints = .{
4204 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
4205 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
4206 .any,
4207 },
4208 .patterns = &.{
4209 .{ .src = .{ .to_mem, .to_mem, .none } },
4210 },
4211 .call_frame = .{ .alignment = .@"16" },
4212 .extra_temps = .{
4213 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4214 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
4215 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
4216 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
4217 .unused,
4218 .unused,
4219 .unused,
4220 .unused,
4221 .unused,
4222 },
4223 .dst_temps = .{ .mem, .unused },
4224 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
4225 .each = .{ .once = &.{
4226 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4227 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4228 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
4229 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
4230 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4231 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4232 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4233 } },
4234 }, .{
4235 .required_features = .{ .sse, null, null, null },
4236 .src_constraints = .{
4237 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
4238 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
4239 .any,
4240 },
4241 .patterns = &.{
4242 .{ .src = .{ .to_mem, .to_mem, .none } },
4243 },
4244 .call_frame = .{ .alignment = .@"16" },
4245 .extra_temps = .{
4246 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4247 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
4248 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
4249 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
4250 .unused,
4251 .unused,
4252 .unused,
4253 .unused,
4254 .unused,
4255 },
4256 .dst_temps = .{ .mem, .unused },
4257 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
4258 .each = .{ .once = &.{
4259 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4260 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4261 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
4262 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
4263 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4264 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4265 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
4266 } },
4267 } }) catch |err| switch (err) {
4268 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
4269 @tagName(air_tag),
4270 cg.typeOf(bin_op.lhs).fmt(pt),
4271 ops[0].tracking(cg),
4272 ops[1].tracking(cg),
4273 }),
4274 else => |e| return e,
4275 };
4276 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
4277 },
4278 .add_safe => unreachable,
4279 .sub, .sub_optimized => |air_tag| if (use_old) try cg.airBinOp(inst, .sub) else {
4280 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
4281 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
4282 var res: [1]Temp = undefined;
4283 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
4284 .src_constraints = .{ .{ .int = .byte }, .{ .int = .byte }, .any },
4285 .patterns = &.{
4286 .{ .src = .{ .mut_mem, .imm8, .none } },
4287 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4288 .{ .src = .{ .mut_mem, .to_gpr, .none } },
4289 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4290 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4291 },
4292 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4293 .clobbers = .{ .eflags = true },
4294 .each = .{ .once = &.{
4295 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
4296 } },
4297 }, .{
4298 .src_constraints = .{ .{ .int = .word }, .{ .int = .word }, .any },
4299 .patterns = &.{
4300 .{ .src = .{ .mut_mem, .imm16, .none } },
4301 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4302 .{ .src = .{ .mut_mem, .to_gpr, .none } },
4303 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4304 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4305 },
4306 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4307 .clobbers = .{ .eflags = true },
4308 .each = .{ .once = &.{
4309 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
4310 } },
4311 }, .{
4312 .src_constraints = .{ .{ .int = .dword }, .{ .int = .dword }, .any },
4313 .patterns = &.{
4314 .{ .src = .{ .mut_mem, .imm32, .none } },
4315 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
4316 .{ .src = .{ .mut_mem, .to_gpr, .none } },
4317 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4318 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4319 },
4320 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4321 .clobbers = .{ .eflags = true },
4322 .each = .{ .once = &.{
4323 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
4324 } },
4325 }, .{
4326 .required_features = .{ .@"64bit", null, null, null },
4327 .src_constraints = .{ .{ .int = .qword }, .{ .int = .qword }, .any },
4328 .patterns = &.{
4329 .{ .src = .{ .mut_mem, .simm32, .none } },
4330 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
4331 .{ .src = .{ .mut_mem, .to_gpr, .none } },
4332 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4333 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4334 },
4335 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4336 .clobbers = .{ .eflags = true },
4337 .each = .{ .once = &.{
4338 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
4339 } },
4340 }, .{
4341 .required_features = .{ .@"64bit", null, null, null },
4342 .src_constraints = .{
4343 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
4344 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
4345 .any,
4346 },
4347 .patterns = &.{
4348 .{ .src = .{ .to_mem, .to_mem, .none } },
4349 },
4350 .extra_temps = .{
4351 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4352 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
4353 .unused,
4354 .unused,
4355 .unused,
4356 .unused,
4357 .unused,
4358 .unused,
4359 .unused,
4360 },
4361 .dst_temps = .{ .mem, .unused },
4362 .clobbers = .{ .eflags = true },
4363 .each = .{ .once = &.{
4364 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
4365 .{ ._, ._c, .cl, ._, ._, ._, ._ },
4366 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
4367 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
4368 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp1q, ._, ._ },
4369 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
4370 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
4371 } },
4372 }, .{
4373 .src_constraints = .{
4374 .{ .remainder_int = .{ .of = .dword, .is = .dword } },
4375 .{ .remainder_int = .{ .of = .dword, .is = .dword } },
4376 .any,
4377 },
4378 .patterns = &.{
4379 .{ .src = .{ .to_mem, .to_mem, .none } },
4380 },
4381 .extra_temps = .{
4382 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4383 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
4384 .unused,
4385 .unused,
4386 .unused,
4387 .unused,
4388 .unused,
4389 .unused,
4390 .unused,
4391 },
4392 .dst_temps = .{ .mem, .unused },
4393 .clobbers = .{ .eflags = true },
4394 .each = .{ .once = &.{
4395 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_4), ._, ._ },
4396 .{ ._, ._c, .cl, ._, ._, ._, ._ },
4397 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_size), ._, ._ },
4398 .{ ._, ._, .sbb, .tmp1d, .memsia(.src1d, .@"4", .tmp0, .add_size), ._, ._ },
4399 .{ ._, ._, .mov, .memsia(.dst0d, .@"4", .tmp0, .add_size), .tmp1d, ._, ._ },
4400 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
4401 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
4402 } },
4403 }, .{
4404 .required_features = .{ .avx, null, null, null },
4405 .src_constraints = .{
4406 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
4407 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
4408 .any,
4409 },
4410 .patterns = &.{
4411 .{ .src = .{ .to_sse, .mem, .none } },
4412 .{ .src = .{ .to_sse, .to_sse, .none } },
4413 },
4414 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
4415 .each = .{ .once = &.{
4416 .{ ._, .vp_b, .sub, .dst0x, .src0x, .src1x, ._ },
4417 } },
4418 }, .{
4419 .required_features = .{ .sse2, null, null, null },
4420 .src_constraints = .{
4421 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
4422 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
4423 .any,
4424 },
4425 .patterns = &.{
4426 .{ .src = .{ .to_mut_sse, .mem, .none } },
4427 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
4428 },
4429 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4430 .each = .{ .once = &.{
4431 .{ ._, .p_b, .sub, .dst0x, .src1x, ._, ._ },
4432 } },
4433 }, .{
4434 .required_features = .{ .avx2, null, null, null },
4435 .src_constraints = .{
4436 .{ .scalar_int = .{ .of = .yword, .is = .byte } },
4437 .{ .scalar_int = .{ .of = .yword, .is = .byte } },
26044438 .any,
26054439 },
26064440 .patterns = &.{
2607 .{ .src = .{ .mem, .mem, .none } },
26084441 .{ .src = .{ .to_sse, .mem, .none } },
2609 .{ .src = .{ .mem, .to_sse, .none } },
26104442 .{ .src = .{ .to_sse, .to_sse, .none } },
26114443 },
2612 .extra_temps = .{
2613 .{ .type = .vector_8_f32, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
2614 .unused,
2615 .unused,
2616 .unused,
2617 .unused,
2618 .unused,
2619 .unused,
2620 .unused,
2621 .unused,
2622 },
26234444 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
26244445 .each = .{ .once = &.{
2625 .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ },
2626 .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ },
2627 .{ ._, .v_ps, .add, .dst0y, .dst0y, .tmp0y, ._ },
2628 .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ },
4446 .{ ._, .vp_b, .sub, .dst0y, .src0y, .src1y, ._ },
26294447 } },
26304448 }, .{
2631 .required_features = .{ .f16c, null, null, null },
4449 .required_features = .{ .avx2, null, null, null },
26324450 .src_constraints = .{
2633 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
2634 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
4451 .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } },
4452 .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } },
26354453 .any,
26364454 },
26374455 .patterns = &.{
......@@ -2639,8 +4457,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
26394457 },
26404458 .extra_temps = .{
26414459 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2642 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
2643 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
4460 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
4461 .unused,
26444462 .unused,
26454463 .unused,
26464464 .unused,
......@@ -2649,32 +4467,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
26494467 .unused,
26504468 },
26514469 .dst_temps = .{ .mem, .unused },
2652 .clobbers = .{ .eflags = true },
26534470 .each = .{ .once = &.{
26544471 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2655 .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2656 .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
2657 .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .tmp2y, ._ },
2658 .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ },
2659 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4472 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
4473 .{ ._, .vp_b, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
4474 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
4475 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
26604476 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26614477 } },
26624478 }, .{
26634479 .required_features = .{ .avx, null, null, null },
26644480 .src_constraints = .{
2665 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
2666 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
4481 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
4482 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
26674483 .any,
26684484 },
26694485 .patterns = &.{
26704486 .{ .src = .{ .to_mem, .to_mem, .none } },
26714487 },
2672 .call_frame = .{ .alignment = .@"16" },
26734488 .extra_temps = .{
26744489 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2675 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
2676 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
2677 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
4490 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
4491 .unused,
4492 .unused,
26784493 .unused,
26794494 .unused,
26804495 .unused,
......@@ -2682,33 +4497,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
26824497 .unused,
26834498 },
26844499 .dst_temps = .{ .mem, .unused },
2685 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
26864500 .each = .{ .once = &.{
26874501 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2688 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
2689 .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) },
2690 .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) },
2691 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
2692 .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ },
2693 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4502 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4503 .{ ._, .vp_b, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
4504 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4505 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
26944506 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
26954507 } },
26964508 }, .{
2697 .required_features = .{ .sse4_1, null, null, null },
4509 .required_features = .{ .sse2, null, null, null },
26984510 .src_constraints = .{
2699 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
2700 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
4511 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
4512 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
27014513 .any,
27024514 },
27034515 .patterns = &.{
27044516 .{ .src = .{ .to_mem, .to_mem, .none } },
27054517 },
2706 .call_frame = .{ .alignment = .@"16" },
27074518 .extra_temps = .{
27084519 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2709 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
2710 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
2711 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
4520 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
4521 .unused,
4522 .unused,
27124523 .unused,
27134524 .unused,
27144525 .unused,
......@@ -2716,178 +4527,123 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
27164527 .unused,
27174528 },
27184529 .dst_temps = .{ .mem, .unused },
2719 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
27204530 .each = .{ .once = &.{
27214531 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2722 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
2723 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
2724 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },
2725 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ },
2726 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
2727 .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ },
2728 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4532 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4533 .{ ._, .p_b, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
4534 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4535 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
27294536 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27304537 } },
27314538 }, .{
2732 .required_features = .{ .sse2, null, null, null },
4539 .required_features = .{ .slow_incdec, null, null, null },
27334540 .src_constraints = .{
2734 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
2735 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
4541 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
4542 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
27364543 .any,
27374544 },
27384545 .patterns = &.{
27394546 .{ .src = .{ .to_mem, .to_mem, .none } },
27404547 },
2741 .call_frame = .{ .alignment = .@"16" },
27424548 .extra_temps = .{
27434549 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2744 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
2745 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
2746 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
2747 .{ .type = .f16, .kind = .{ .reg = .ax } },
4550 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
4551 .unused,
4552 .unused,
4553 .unused,
27484554 .unused,
27494555 .unused,
27504556 .unused,
27514557 .unused,
27524558 },
27534559 .dst_temps = .{ .mem, .unused },
2754 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
27554560 .each = .{ .once = &.{
27564561 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2757 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
2758 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
2759 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },
2760 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ },
2761 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
2762 .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ },
2763 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp4w, ._, ._ },
2764 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4562 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
4563 .{ ._, ._, .sub, .tmp1b, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._ },
4564 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ },
4565 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
27654566 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
27664567 } },
27674568 }, .{
2768 .required_features = .{ .sse, null, null, null },
27694569 .src_constraints = .{
2770 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
2771 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
4570 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
4571 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
27724572 .any,
27734573 },
27744574 .patterns = &.{
27754575 .{ .src = .{ .to_mem, .to_mem, .none } },
27764576 },
2777 .call_frame = .{ .alignment = .@"16" },
27784577 .extra_temps = .{
27794578 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2780 .{ .type = .f16, .kind = .{ .reg = .ax } },
2781 .{ .type = .f32, .kind = .mem },
2782 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
2783 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
2784 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
4579 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
4580 .unused,
4581 .unused,
4582 .unused,
4583 .unused,
27854584 .unused,
27864585 .unused,
27874586 .unused,
27884587 },
27894588 .dst_temps = .{ .mem, .unused },
2790 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
27914589 .each = .{ .once = &.{
27924590 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2793 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ },
2794 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
2795 .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ },
2796 .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ },
2797 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
2798 .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ },
2799 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
2800 .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ },
2801 .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ },
2802 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ },
2803 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
2804 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2805 } },
2806 }, .{
2807 .required_features = .{ .avx, null, null, null },
2808 .src_constraints = .{
2809 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
2810 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
2811 .any,
2812 },
2813 .patterns = &.{
2814 .{ .src = .{ .to_sse, .mem, .none } },
2815 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2816 .{ .src = .{ .to_sse, .to_sse, .none } },
2817 },
2818 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2819 .each = .{ .once = &.{
2820 .{ ._, .v_ss, .add, .dst0x, .src0x, .src1d, ._ },
2821 } },
2822 }, .{
2823 .required_features = .{ .sse, null, null, null },
2824 .src_constraints = .{
2825 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
2826 .{ .scalar_float = .{ .of = .dword, .is = .dword } },
2827 .any,
2828 },
2829 .patterns = &.{
2830 .{ .src = .{ .to_mut_sse, .mem, .none } },
2831 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
2832 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
2833 },
2834 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2835 .each = .{ .once = &.{
2836 .{ ._, ._ss, .add, .dst0x, .src1d, ._, ._ },
4591 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
4592 .{ ._, ._, .sub, .tmp1b, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._ },
4593 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ },
4594 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
4595 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
28374596 } },
28384597 }, .{
28394598 .required_features = .{ .avx, null, null, null },
28404599 .src_constraints = .{
2841 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
2842 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
4600 .{ .scalar_int = .{ .of = .xword, .is = .word } },
4601 .{ .scalar_int = .{ .of = .xword, .is = .word } },
28434602 .any,
28444603 },
28454604 .patterns = &.{
28464605 .{ .src = .{ .to_sse, .mem, .none } },
2847 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
28484606 .{ .src = .{ .to_sse, .to_sse, .none } },
28494607 },
28504608 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
28514609 .each = .{ .once = &.{
2852 .{ ._, .v_ps, .add, .dst0x, .src0x, .src1x, ._ },
4610 .{ ._, .vp_w, .sub, .dst0x, .src0x, .src1x, ._ },
28534611 } },
28544612 }, .{
2855 .required_features = .{ .sse, null, null, null },
4613 .required_features = .{ .sse2, null, null, null },
28564614 .src_constraints = .{
2857 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
2858 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
4615 .{ .scalar_int = .{ .of = .xword, .is = .word } },
4616 .{ .scalar_int = .{ .of = .xword, .is = .word } },
28594617 .any,
28604618 },
28614619 .patterns = &.{
28624620 .{ .src = .{ .to_mut_sse, .mem, .none } },
2863 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
28644621 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
28654622 },
28664623 .dst_temps = .{ .{ .ref = .src0 }, .unused },
28674624 .each = .{ .once = &.{
2868 .{ ._, ._ps, .add, .dst0x, .src1x, ._, ._ },
4625 .{ ._, .p_w, .sub, .dst0x, .src1x, ._, ._ },
28694626 } },
28704627 }, .{
2871 .required_features = .{ .avx, null, null, null },
4628 .required_features = .{ .avx2, null, null, null },
28724629 .src_constraints = .{
2873 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
2874 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
4630 .{ .scalar_int = .{ .of = .yword, .is = .word } },
4631 .{ .scalar_int = .{ .of = .yword, .is = .word } },
28754632 .any,
28764633 },
28774634 .patterns = &.{
28784635 .{ .src = .{ .to_sse, .mem, .none } },
2879 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
28804636 .{ .src = .{ .to_sse, .to_sse, .none } },
28814637 },
28824638 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
28834639 .each = .{ .once = &.{
2884 .{ ._, .v_ps, .add, .dst0y, .src0y, .src1y, ._ },
4640 .{ ._, .vp_w, .sub, .dst0y, .src0y, .src1y, ._ },
28854641 } },
28864642 }, .{
2887 .required_features = .{ .avx, null, null, null },
4643 .required_features = .{ .avx2, null, null, null },
28884644 .src_constraints = .{
2889 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
2890 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
4645 .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } },
4646 .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } },
28914647 .any,
28924648 },
28934649 .patterns = &.{
......@@ -2895,7 +4651,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
28954651 },
28964652 .extra_temps = .{
28974653 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2898 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
4654 .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } },
28994655 .unused,
29004656 .unused,
29014657 .unused,
......@@ -2905,20 +4661,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
29054661 .unused,
29064662 },
29074663 .dst_temps = .{ .mem, .unused },
2908 .clobbers = .{ .eflags = true },
29094664 .each = .{ .once = &.{
29104665 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2911 .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
2912 .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
2913 .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
4666 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
4667 .{ ._, .vp_w, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
4668 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
29144669 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
29154670 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
29164671 } },
29174672 }, .{
2918 .required_features = .{ .sse, null, null, null },
4673 .required_features = .{ .avx, null, null, null },
29194674 .src_constraints = .{
2920 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
2921 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
4675 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
4676 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
29224677 .any,
29234678 },
29244679 .patterns = &.{
......@@ -2926,7 +4681,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
29264681 },
29274682 .extra_temps = .{
29284683 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2929 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
4684 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
29304685 .unused,
29314686 .unused,
29324687 .unused,
......@@ -2936,60 +4691,56 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
29364691 .unused,
29374692 },
29384693 .dst_temps = .{ .mem, .unused },
2939 .clobbers = .{ .eflags = true },
29404694 .each = .{ .once = &.{
29414695 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2942 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2943 .{ ._, ._ps, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
2944 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4696 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4697 .{ ._, .vp_w, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
4698 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
29454699 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
29464700 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
29474701 } },
2948 }, .{
2949 .required_features = .{ .avx, null, null, null },
2950 .src_constraints = .{
2951 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
2952 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
2953 .any,
2954 },
2955 .patterns = &.{
2956 .{ .src = .{ .to_sse, .mem, .none } },
2957 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2958 .{ .src = .{ .to_sse, .to_sse, .none } },
2959 },
2960 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2961 .each = .{ .once = &.{
2962 .{ ._, .v_sd, .add, .dst0x, .src0x, .src1q, ._ },
2963 } },
29644702 }, .{
29654703 .required_features = .{ .sse2, null, null, null },
29664704 .src_constraints = .{
2967 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
2968 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
4705 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
4706 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
29694707 .any,
29704708 },
29714709 .patterns = &.{
2972 .{ .src = .{ .to_mut_sse, .mem, .none } },
2973 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
2974 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
4710 .{ .src = .{ .to_mem, .to_mem, .none } },
29754711 },
2976 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4712 .extra_temps = .{
4713 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4714 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
4715 .unused,
4716 .unused,
4717 .unused,
4718 .unused,
4719 .unused,
4720 .unused,
4721 .unused,
4722 },
4723 .dst_temps = .{ .mem, .unused },
29774724 .each = .{ .once = &.{
2978 .{ ._, ._sd, .add, .dst0x, .src1q, ._, ._ },
4725 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4726 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4727 .{ ._, .p_w, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
4728 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4729 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
4730 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
29794731 } },
29804732 }, .{
2981 .required_features = .{ .x87, null, null, null },
29824733 .src_constraints = .{
2983 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
2984 .{ .scalar_float = .{ .of = .qword, .is = .qword } },
4734 .{ .multiple_scalar_int = .{ .of = .word, .is = .word } },
4735 .{ .multiple_scalar_int = .{ .of = .word, .is = .word } },
29854736 .any,
29864737 },
29874738 .patterns = &.{
29884739 .{ .src = .{ .to_mem, .to_mem, .none } },
29894740 },
29904741 .extra_temps = .{
2991 .{ .type = .f64, .kind = .{ .reg = .st6 } },
2992 .{ .type = .f64, .kind = .{ .reg = .st7 } },
4742 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4743 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
29934744 .unused,
29944745 .unused,
29954746 .unused,
......@@ -3000,63 +4751,63 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
30004751 },
30014752 .dst_temps = .{ .mem, .unused },
30024753 .each = .{ .once = &.{
3003 .{ ._, .f_, .ld, .src0q, ._, ._, ._ },
3004 .{ ._, .f_, .add, .src1q, ._, ._, ._ },
3005 .{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
4754 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4755 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ },
4756 .{ ._, ._, .sub, .tmp1w, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ },
4757 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1w, ._, ._ },
4758 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
4759 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
30064760 } },
30074761 }, .{
30084762 .required_features = .{ .avx, null, null, null },
30094763 .src_constraints = .{
3010 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
3011 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
4764 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
4765 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
30124766 .any,
30134767 },
30144768 .patterns = &.{
30154769 .{ .src = .{ .to_sse, .mem, .none } },
3016 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
30174770 .{ .src = .{ .to_sse, .to_sse, .none } },
30184771 },
30194772 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
30204773 .each = .{ .once = &.{
3021 .{ ._, .v_pd, .add, .dst0x, .src0x, .src1x, ._ },
4774 .{ ._, .vp_d, .sub, .dst0x, .src0x, .src1x, ._ },
30224775 } },
30234776 }, .{
30244777 .required_features = .{ .sse2, null, null, null },
30254778 .src_constraints = .{
3026 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
3027 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
4779 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
4780 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
30284781 .any,
30294782 },
30304783 .patterns = &.{
30314784 .{ .src = .{ .to_mut_sse, .mem, .none } },
3032 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
30334785 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
30344786 },
30354787 .dst_temps = .{ .{ .ref = .src0 }, .unused },
30364788 .each = .{ .once = &.{
3037 .{ ._, ._pd, .add, .dst0x, .src1x, ._, ._ },
4789 .{ ._, .p_d, .sub, .dst0x, .src1x, ._, ._ },
30384790 } },
30394791 }, .{
3040 .required_features = .{ .avx, null, null, null },
4792 .required_features = .{ .avx2, null, null, null },
30414793 .src_constraints = .{
3042 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
3043 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
4794 .{ .scalar_int = .{ .of = .yword, .is = .dword } },
4795 .{ .scalar_int = .{ .of = .yword, .is = .dword } },
30444796 .any,
30454797 },
30464798 .patterns = &.{
30474799 .{ .src = .{ .to_sse, .mem, .none } },
3048 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
30494800 .{ .src = .{ .to_sse, .to_sse, .none } },
30504801 },
30514802 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
30524803 .each = .{ .once = &.{
3053 .{ ._, .v_pd, .add, .dst0y, .src0y, .src1y, ._ },
4804 .{ ._, .vp_d, .sub, .dst0y, .src0y, .src1y, ._ },
30544805 } },
30554806 }, .{
3056 .required_features = .{ .avx, null, null, null },
4807 .required_features = .{ .avx2, null, null, null },
30574808 .src_constraints = .{
3058 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
3059 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
4809 .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } },
4810 .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } },
30604811 .any,
30614812 },
30624813 .patterns = &.{
......@@ -3064,7 +4815,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
30644815 },
30654816 .extra_temps = .{
30664817 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3067 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
4818 .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } },
30684819 .unused,
30694820 .unused,
30704821 .unused,
......@@ -3074,20 +4825,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
30744825 .unused,
30754826 },
30764827 .dst_temps = .{ .mem, .unused },
3077 .clobbers = .{ .eflags = true },
30784828 .each = .{ .once = &.{
30794829 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3080 .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
3081 .{ ._, .v_pd, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
3082 .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
4830 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
4831 .{ ._, .vp_d, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
4832 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
30834833 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
30844834 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
30854835 } },
30864836 }, .{
3087 .required_features = .{ .sse2, null, null, null },
4837 .required_features = .{ .avx, null, null, null },
30884838 .src_constraints = .{
3089 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
3090 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
4839 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
4840 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
30914841 .any,
30924842 },
30934843 .patterns = &.{
......@@ -3095,7 +4845,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
30954845 },
30964846 .extra_temps = .{
30974847 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3098 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
4848 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
30994849 .unused,
31004850 .unused,
31014851 .unused,
......@@ -3105,20 +4855,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
31054855 .unused,
31064856 },
31074857 .dst_temps = .{ .mem, .unused },
3108 .clobbers = .{ .eflags = true },
31094858 .each = .{ .once = &.{
31104859 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3111 .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3112 .{ ._, ._pd, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3113 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4860 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4861 .{ ._, .vp_d, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
4862 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
31144863 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
31154864 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
31164865 } },
31174866 }, .{
3118 .required_features = .{ .x87, null, null, null },
4867 .required_features = .{ .sse2, null, null, null },
31194868 .src_constraints = .{
3120 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
3121 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
4869 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
4870 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
31224871 .any,
31234872 },
31244873 .patterns = &.{
......@@ -3126,8 +4875,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
31264875 },
31274876 .extra_temps = .{
31284877 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3129 .{ .type = .f64, .kind = .{ .reg = .st6 } },
3130 .{ .type = .f64, .kind = .{ .reg = .st7 } },
4878 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
4879 .unused,
31314880 .unused,
31324881 .unused,
31334882 .unused,
......@@ -3138,25 +4887,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
31384887 .dst_temps = .{ .mem, .unused },
31394888 .each = .{ .once = &.{
31404889 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3141 .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ },
3142 .{ ._, .f_, .add, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._, ._ },
3143 .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ },
3144 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
4890 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
4891 .{ ._, .p_d, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
4892 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
4893 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
31454894 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
31464895 } },
31474896 }, .{
3148 .required_features = .{ .x87, null, null, null },
31494897 .src_constraints = .{
3150 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
3151 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
4898 .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } },
4899 .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } },
31524900 .any,
31534901 },
31544902 .patterns = &.{
3155 .{ .src = .{ .mem, .mem, .none } },
4903 .{ .src = .{ .to_mem, .to_mem, .none } },
31564904 },
31574905 .extra_temps = .{
3158 .{ .type = .f80, .kind = .{ .reg = .st6 } },
3159 .{ .type = .f80, .kind = .{ .reg = .st7 } },
4906 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4907 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
31604908 .unused,
31614909 .unused,
31624910 .unused,
......@@ -3165,28 +4913,73 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
31654913 .unused,
31664914 .unused,
31674915 },
3168 .dst_temps = .{ .{ .rc = .x87 }, .unused },
4916 .dst_temps = .{ .mem, .unused },
31694917 .each = .{ .once = &.{
3170 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
3171 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
3172 .{ ._, .f_p, .add, ._, ._, ._, ._ },
3173 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
4918 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4919 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ },
4920 .{ ._, ._, .sub, .tmp1d, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ },
4921 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ },
4922 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4923 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
31744924 } },
31754925 }, .{
3176 .required_features = .{ .x87, null, null, null },
4926 .required_features = .{ .avx, null, null, null },
31774927 .src_constraints = .{
3178 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
3179 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },
4928 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
4929 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
31804930 .any,
31814931 },
31824932 .patterns = &.{
3183 .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } },
3184 .{ .src = .{ .mem, .to_x87, .none } },
3185 .{ .src = .{ .to_x87, .to_x87, .none } },
4933 .{ .src = .{ .to_sse, .mem, .none } },
4934 .{ .src = .{ .to_sse, .to_sse, .none } },
4935 },
4936 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
4937 .each = .{ .once = &.{
4938 .{ ._, .vp_q, .sub, .dst0x, .src0x, .src1x, ._ },
4939 } },
4940 }, .{
4941 .required_features = .{ .sse2, null, null, null },
4942 .src_constraints = .{
4943 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
4944 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
4945 .any,
4946 },
4947 .patterns = &.{
4948 .{ .src = .{ .to_mut_sse, .mem, .none } },
4949 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
4950 },
4951 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4952 .each = .{ .once = &.{
4953 .{ ._, .p_q, .sub, .dst0x, .src1x, ._, ._ },
4954 } },
4955 }, .{
4956 .required_features = .{ .avx2, null, null, null },
4957 .src_constraints = .{
4958 .{ .scalar_int = .{ .of = .yword, .is = .qword } },
4959 .{ .scalar_int = .{ .of = .yword, .is = .qword } },
4960 .any,
4961 },
4962 .patterns = &.{
4963 .{ .src = .{ .to_sse, .mem, .none } },
4964 .{ .src = .{ .to_sse, .to_sse, .none } },
4965 },
4966 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
4967 .each = .{ .once = &.{
4968 .{ ._, .vp_q, .sub, .dst0y, .src0y, .src1y, ._ },
4969 } },
4970 }, .{
4971 .required_features = .{ .avx2, null, null, null },
4972 .src_constraints = .{
4973 .{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } },
4974 .{ .multiple_scalar_int = .{ .of = .yword, .is = .qword } },
4975 .any,
4976 },
4977 .patterns = &.{
4978 .{ .src = .{ .to_mem, .to_mem, .none } },
31864979 },
31874980 .extra_temps = .{
3188 .{ .type = .f80, .kind = .{ .reg = .st7 } },
3189 .unused,
4981 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4982 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
31904983 .unused,
31914984 .unused,
31924985 .unused,
......@@ -3195,17 +4988,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
31954988 .unused,
31964989 .unused,
31974990 },
3198 .dst_temps = .{ .{ .rc = .x87 }, .unused },
4991 .dst_temps = .{ .mem, .unused },
31994992 .each = .{ .once = &.{
3200 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },
3201 .{ ._, .f_, .add, .tmp0t, .src1t, ._, ._ },
3202 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
4993 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
4994 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
4995 .{ ._, .vp_q, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
4996 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
4997 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
4998 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
32034999 } },
32045000 }, .{
3205 .required_features = .{ .x87, null, null, null },
5001 .required_features = .{ .avx, null, null, null },
32065002 .src_constraints = .{
3207 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
3208 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
5003 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
5004 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
32095005 .any,
32105006 },
32115007 .patterns = &.{
......@@ -3213,8 +5009,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
32135009 },
32145010 .extra_temps = .{
32155011 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3216 .{ .type = .f80, .kind = .{ .reg = .st6 } },
3217 .{ .type = .f80, .kind = .{ .reg = .st7 } },
5012 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
5013 .unused,
32185014 .unused,
32195015 .unused,
32205016 .unused,
......@@ -3225,27 +5021,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
32255021 .dst_temps = .{ .mem, .unused },
32265022 .each = .{ .once = &.{
32275023 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3228 .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ },
3229 .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ },
3230 .{ ._, .f_p, .add, ._, ._, ._, ._ },
3231 .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ },
5024 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
5025 .{ ._, .vp_q, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
5026 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
32325027 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
32335028 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
32345029 } },
32355030 }, .{
3236 .required_features = .{ .sse, null, null, null },
5031 .required_features = .{ .sse2, null, null, null },
32375032 .src_constraints = .{
3238 .{ .scalar_float = .{ .of = .xword, .is = .xword } },
3239 .{ .scalar_float = .{ .of = .xword, .is = .xword } },
5033 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
5034 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
32405035 .any,
32415036 },
32425037 .patterns = &.{
3243 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } },
5038 .{ .src = .{ .to_mem, .to_mem, .none } },
32445039 },
3245 .call_frame = .{ .alignment = .@"16" },
32465040 .extra_temps = .{
3247 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
3248 .unused,
5041 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5042 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
32495043 .unused,
32505044 .unused,
32515045 .unused,
......@@ -3254,27 +5048,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
32545048 .unused,
32555049 .unused,
32565050 },
3257 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3258 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
5051 .dst_temps = .{ .mem, .unused },
32595052 .each = .{ .once = &.{
3260 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
5053 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
5054 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
5055 .{ ._, .p_q, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
5056 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
5057 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5058 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
32615059 } },
32625060 }, .{
3263 .required_features = .{ .avx, null, null, null },
5061 .required_features = .{ .@"64bit", null, null, null },
32645062 .src_constraints = .{
3265 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
3266 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
5063 .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } },
5064 .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } },
32675065 .any,
32685066 },
32695067 .patterns = &.{
32705068 .{ .src = .{ .to_mem, .to_mem, .none } },
32715069 },
3272 .call_frame = .{ .alignment = .@"16" },
32735070 .extra_temps = .{
32745071 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3275 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
3276 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
3277 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
5072 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5073 .unused,
5074 .unused,
32785075 .unused,
32795076 .unused,
32805077 .unused,
......@@ -3282,100 +5079,88 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
32825079 .unused,
32835080 },
32845081 .dst_temps = .{ .mem, .unused },
3285 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
32865082 .each = .{ .once = &.{
32875083 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3288 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3289 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3290 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
3291 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3292 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5084 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ },
5085 .{ ._, ._, .sub, .tmp1q, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ },
5086 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ },
5087 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
32935088 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
32945089 } },
32955090 }, .{
3296 .required_features = .{ .sse2, null, null, null },
5091 .required_features = .{ .@"64bit", null, null, null },
32975092 .src_constraints = .{
3298 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
3299 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
5093 .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } },
5094 .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } },
33005095 .any,
33015096 },
33025097 .patterns = &.{
33035098 .{ .src = .{ .to_mem, .to_mem, .none } },
33045099 },
3305 .call_frame = .{ .alignment = .@"16" },
33065100 .extra_temps = .{
33075101 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3308 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
3309 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
3310 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
3311 .unused,
3312 .unused,
5102 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5103 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5104 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5105 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5106 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33135107 .unused,
33145108 .unused,
33155109 .unused,
33165110 },
33175111 .dst_temps = .{ .mem, .unused },
3318 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
33195112 .each = .{ .once = &.{
3320 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3321 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3322 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3323 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
3324 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3325 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5113 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5114 .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_add_elem_size), ._, ._ },
5115 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_add_elem_size), ._, ._ },
5116 .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size_add_elem_size), ._, ._ },
5117 .{ ._, ._, .mov, .tmp4p, .sa(.src0, .sub_elem_size_div_8), ._, ._ },
5118 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5119 .{ .@"1:", ._, .mov, .tmp5q, .leasi(.tmp1q, .@"8", .tmp4), ._, ._ },
5120 .{ ._, ._, .sbb, .tmp5q, .leasi(.tmp2q, .@"8", .tmp4), ._, ._ },
5121 .{ ._, ._, .mov, .leasi(.tmp3q, .@"8", .tmp4), .tmp5q, ._, ._ },
5122 .{ ._, ._c, .in, .tmp4p, ._, ._, ._ },
5123 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
5124 .{ ._, ._, .add, .tmp0p, .sa(.src0, .add_elem_size), ._, ._ },
33265125 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
33275126 } },
33285127 }, .{
3329 .required_features = .{ .sse, null, null, null },
33305128 .src_constraints = .{
3331 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
3332 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
5129 .{ .scalar_remainder_int = .{ .of = .dword, .is = .dword } },
5130 .{ .scalar_remainder_int = .{ .of = .dword, .is = .dword } },
33335131 .any,
33345132 },
33355133 .patterns = &.{
33365134 .{ .src = .{ .to_mem, .to_mem, .none } },
33375135 },
3338 .call_frame = .{ .alignment = .@"16" },
33395136 .extra_temps = .{
33405137 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3341 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
3342 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
3343 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
3344 .unused,
3345 .unused,
5138 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5139 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5140 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5141 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5142 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
33465143 .unused,
33475144 .unused,
33485145 .unused,
33495146 },
33505147 .dst_temps = .{ .mem, .unused },
3351 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
33525148 .each = .{ .once = &.{
3353 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3354 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3355 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3356 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
3357 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3358 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5149 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5150 .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_add_elem_size), ._, ._ },
5151 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_add_elem_size), ._, ._ },
5152 .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size_add_elem_size), ._, ._ },
5153 .{ ._, ._, .mov, .tmp4p, .sa(.src0, .sub_elem_size_div_4), ._, ._ },
5154 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5155 .{ .@"1:", ._, .mov, .tmp5d, .leasi(.tmp1d, .@"4", .tmp4), ._, ._ },
5156 .{ ._, ._, .sbb, .tmp5d, .leasi(.tmp2d, .@"4", .tmp4), ._, ._ },
5157 .{ ._, ._, .mov, .leasi(.tmp3d, .@"4", .tmp4), .tmp5d, ._, ._ },
5158 .{ ._, ._c, .in, .tmp4p, ._, ._, ._ },
5159 .{ ._, ._nz, .j, .@"1b", ._, ._, ._ },
5160 .{ ._, ._, .add, .tmp0p, .sa(.src0, .add_elem_size), ._, ._ },
33595161 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
33605162 } },
3361 } }) catch |err| switch (err) {
3362 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
3363 @tagName(air_tag),
3364 cg.typeOf(bin_op.lhs).fmt(pt),
3365 ops[0].tracking(cg),
3366 ops[1].tracking(cg),
3367 }),
3368 else => |e| return e,
3369 };
3370 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
3371 },
3372 .add_safe => unreachable,
3373 .sub, .sub_optimized => |air_tag| if (use_old) try cg.airBinOp(inst, .sub) else fallback: {
3374 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
3375 if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airBinOp(inst, air_tag);
3376 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
3377 var res: [1]Temp = undefined;
3378 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
5163 }, .{
33795164 .required_features = .{ .f16c, null, null, null },
33805165 .src_constraints = .{
33815166 .{ .scalar_float = .{ .of = .word, .is = .word } },
......@@ -89330,6 +91115,7 @@ const Select = struct {
8933091115 size,
8933191116 delta_size,
8933291117 delta_elem_size,
91118 size_add_elem_size,
8933391119 size_sub_elem_size,
8933491120 unaligned_size,
8933591121 bit_size,
......@@ -89361,6 +91147,7 @@ const Select = struct {
8936191147 const add_delta_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_size, .op = .div, .rhs = .@"8" };
8936291148 const add_delta_elem_size: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .mul, .rhs = .@"1" };
8936391149 const add_delta_elem_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .div, .rhs = .@"8" };
91150 const add_size_add_elem_size: Adjust = .{ .sign = .pos, .lhs = .size_add_elem_size, .op = .mul, .rhs = .@"1" };
8936491151 const add_size_sub_elem_size: Adjust = .{ .sign = .pos, .lhs = .size_sub_elem_size, .op = .mul, .rhs = .@"1" };
8936591152 const add_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };
8936691153 const sub_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };
......@@ -89377,8 +91164,11 @@ const Select = struct {
8937791164 const add_2_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"2" };
8937891165 const add_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"1" };
8937991166 const sub_len: Adjust = .{ .sign = .neg, .lhs = .len, .op = .mul, .rhs = .@"1" };
89380 const add_elem_size_div_8: Adjust = .{ .sign = .pos, .lhs = .elem_size, .op = .div, .rhs = .@"8" };
8938191167 const add_8_elem_size: Adjust = .{ .sign = .pos, .lhs = .elem_size, .op = .mul, .rhs = .@"8" };
91168 const add_elem_size: Adjust = .{ .sign = .pos, .lhs = .elem_size, .op = .mul, .rhs = .@"1" };
91169 const add_elem_size_div_8: Adjust = .{ .sign = .pos, .lhs = .elem_size, .op = .div, .rhs = .@"8" };
91170 const sub_elem_size_div_8: Adjust = .{ .sign = .neg, .lhs = .elem_size, .op = .div, .rhs = .@"8" };
91171 const sub_elem_size_div_4: Adjust = .{ .sign = .neg, .lhs = .elem_size, .op = .div, .rhs = .@"4" };
8938291172 const add_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"1" };
8938391173 const add_2_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"2" };
8938491174 const add_4_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"4" };
......@@ -89940,6 +91730,10 @@ const Select = struct {
8994091730 @as(SignedImm, @intCast(op.index.ref.typeOf(s).abiSize(s.cg.pt.zcu)))),
8994191731 .delta_elem_size => @intCast(@as(SignedImm, @intCast(op.base.ref.typeOf(s).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu))) -
8994291732 @as(SignedImm, @intCast(op.index.ref.typeOf(s).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu)))),
91733 .size_add_elem_size => {
91734 const ty = op.base.ref.typeOf(s);
91735 break :lhs @intCast(ty.abiSize(s.cg.pt.zcu) + ty.elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu));
91736 },
8994391737 .size_sub_elem_size => {
8994491738 const ty = op.base.ref.typeOf(s);
8994591739 break :lhs @intCast(ty.abiSize(s.cg.pt.zcu) - ty.elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu));
test/behavior/x86_64/math.zig+37-12
......@@ -33,6 +33,17 @@ fn Scalar(comptime Type: type) type {
3333 .vector => |info| info.child,
3434 };
3535}
36fn AddOneBit(comptime Type: type) type {
37 const ResultScalar = switch (@typeInfo(Scalar(Type))) {
38 .int => |int| @Type(.{ .int = .{ .signedness = int.signedness, .bits = 1 + int.bits } }),
39 .float => Scalar(Type),
40 else => @compileError(@typeName(Type)),
41 };
42 return switch (@typeInfo(Type)) {
43 else => ResultScalar,
44 .vector => |vector| @Vector(vector.len, ResultScalar),
45 };
46}
3647// inline to avoid a runtime `@splat`
3748inline fn splat(comptime Type: type, scalar: Scalar(Type)) Type {
3849 return switch (@typeInfo(Type)) {
......@@ -18950,22 +18961,36 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
1895018961 };
1895118962}
1895218963
18953inline fn add(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs + rhs) {
18954 return lhs + rhs;
18964inline fn addUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
18965 @setRuntimeSafety(false);
18966 return @as(AddOneBit(Type), lhs) + rhs;
1895518967}
18956test add {
18957 const test_add = binary(add, .{});
18958 try test_add.testFloats();
18959 try test_add.testFloatVectors();
18968test addUnsafe {
18969 const test_add_unsafe = binary(addUnsafe, .{});
18970 try test_add_unsafe.testInts();
18971 try test_add_unsafe.testIntVectors();
18972 try test_add_unsafe.testFloats();
18973 try test_add_unsafe.testFloatVectors();
1896018974}
1896118975
18962inline fn subtract(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs - rhs) {
18963 return lhs - rhs;
18976inline fn subUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
18977 @setRuntimeSafety(false);
18978 switch (@typeInfo(Scalar(Type))) {
18979 .int => |int| switch (int.signedness) {
18980 .signed => {},
18981 .unsigned => return @as(AddOneBit(Type), @max(lhs, rhs)) - @min(lhs, rhs),
18982 },
18983 .float => {},
18984 else => @compileError(@typeName(Type)),
18985 }
18986 return @as(AddOneBit(Type), lhs) - rhs;
1896418987}
18965test subtract {
18966 const test_subtract = binary(subtract, .{});
18967 try test_subtract.testFloats();
18968 try test_subtract.testFloatVectors();
18988test subUnsafe {
18989 const test_sub_unsafe = binary(subUnsafe, .{});
18990 try test_sub_unsafe.testInts();
18991 try test_sub_unsafe.testIntVectors();
18992 try test_sub_unsafe.testFloats();
18993 try test_sub_unsafe.testFloatVectors();
1896918994}
1897018995
1897118996inline fn multiply(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs * rhs) {