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 {...@@ -2418,7 +2418,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2418}2418}
24192419
2420fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {2420fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2421 @setEvalBranchQuota(11_900);2421 @setEvalBranchQuota(12_200);
2422 const pt = cg.pt;2422 const pt = cg.pt;
2423 const zcu = pt.zcu;2423 const zcu = pt.zcu;
2424 const ip = &zcu.intern_pool;2424 const ip = &zcu.intern_pool;
...@@ -2454,9 +2454,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2454,9 +2454,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2454 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);2454 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);
2455 switch (air_tags[@intFromEnum(inst)]) {2455 switch (air_tags[@intFromEnum(inst)]) {
2456 // zig fmt: off2456 // zig fmt: off
2457 .add_wrap,2457 .add_wrap => try cg.airBinOp(inst, .add_wrap),
2458 .sub_wrap,2458 .sub_wrap => try cg.airBinOp(inst, .sub_wrap),
2459 => |air_tag| try cg.airBinOp(inst, air_tag),
24602459
2461 .shr, .shr_exact => try cg.airShlShrBinOp(inst),2460 .shr, .shr_exact => try cg.airShlShrBinOp(inst),
2462 .shl, .shl_exact => try cg.airShlShrBinOp(inst),2461 .shl, .shl_exact => try cg.airShlShrBinOp(inst),
...@@ -2505,24 +2504,127 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2505,24 +2504,127 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2505 if (arg != .none) break;2504 if (arg != .none) break;
2506 } else try cg.airDbgVarArgs();2505 } else try cg.airDbgVarArgs();
2507 },2506 },
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 {
2509 const bin_op = air_datas[@intFromEnum(inst)].bin_op;2508 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);
2511 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });2509 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
2512 var res: [1]Temp = undefined;2510 var res: [1]Temp = undefined;
2513 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{2511 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 },
2515 .src_constraints = .{2586 .src_constraints = .{
2516 .{ .scalar_float = .{ .of = .word, .is = .word } },2587 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
2517 .{ .scalar_float = .{ .of = .word, .is = .word } },2588 .{ .remainder_int = .{ .of = .qword, .is = .qword } },
2518 .any,2589 .any,
2519 },2590 },
2520 .patterns = &.{2591 .patterns = &.{
2521 .{ .src = .{ .to_sse, .to_sse, .none } },2592 .{ .src = .{ .to_mem, .to_mem, .none } },
2522 },2593 },
2523 .extra_temps = .{2594 .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,
2525 .unused,2603 .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 } },
2526 .unused,2628 .unused,
2527 .unused,2629 .unused,
2528 .unused,2630 .unused,
...@@ -2531,107 +2633,1823 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2531,107 +2633,1823 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2531 .unused,2633 .unused,
2532 .unused,2634 .unused,
2533 },2635 },
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 },
2534 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },2659 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2535 .each = .{ .once = &.{2660 .each = .{ .once = &.{
2536 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },2661 .{ ._, .vp_b, .add, .dst0x, .src0x, .src1x, ._ },
2537 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
2538 .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0d, ._ },
2539 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
2540 } },2662 } },
2541 }, .{2663 }, .{
2542 .required_features = .{ .sse, null, null, null },2664 .required_features = .{ .sse2, null, null, null },
2543 .src_constraints = .{2665 .src_constraints = .{
2544 .{ .scalar_float = .{ .of = .word, .is = .word } },2666 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
2545 .{ .scalar_float = .{ .of = .word, .is = .word } },2667 .{ .scalar_int = .{ .of = .xword, .is = .byte } },
2546 .any,2668 .any,
2547 },2669 },
2548 .patterns = &.{2670 .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 } },
2550 },2704 },
2551 .call_frame = .{ .alignment = .@"16" },
2552 .extra_temps = .{2705 .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,
2554 .unused,2801 .unused,
2555 .unused,2802 .unused,
2556 .unused,2803 .unused,
2557 .unused,2804 .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,
2558 .unused,2830 .unused,
2559 .unused,2831 .unused,
2560 .unused,2832 .unused,
2561 .unused,2833 .unused,
2562 },2834 },
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 },
2563 .dst_temps = .{ .{ .ref = .src0 }, .unused },2872 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2564 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
2565 .each = .{ .once = &.{2873 .each = .{ .once = &.{
2566 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },2874 .{ ._, .p_w, .add, .dst0x, .src1x, ._, ._ },
2567 } },2875 } },
2568 }, .{2876 }, .{
2569 .required_features = .{ .f16c, null, null, null },2877 .required_features = .{ .avx2, null, null, null },
2570 .src_constraints = .{2878 .src_constraints = .{
2571 .{ .scalar_float = .{ .of = .qword, .is = .word } },2879 .{ .scalar_int = .{ .of = .yword, .is = .word } },
2572 .{ .scalar_float = .{ .of = .qword, .is = .word } },2880 .{ .scalar_int = .{ .of = .yword, .is = .word } },
2573 .any,2881 .any,
2574 },2882 },
2575 .patterns = &.{2883 .patterns = &.{
2576 .{ .src = .{ .mem, .mem, .none } },
2577 .{ .src = .{ .to_sse, .mem, .none } },2884 .{ .src = .{ .to_sse, .mem, .none } },
2578 .{ .src = .{ .mem, .to_sse, .none } },2885 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2579 .{ .src = .{ .to_sse, .to_sse, .none } },2886 .{ .src = .{ .to_sse, .to_sse, .none } },
2580 },2887 },
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 },
2581 .extra_temps = .{2902 .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,
2583 .unused,2966 .unused,
2584 .unused,2967 .unused,
2585 .unused,2968 .unused,
2586 .unused,2969 .unused,
2587 .unused,2970 .unused,
2588 .unused,2971 .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,
2589 .unused,2999 .unused,
2590 .unused,3000 .unused,
2591 },3001 },
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 },
2592 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },3023 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2593 .each = .{ .once = &.{3024 .each = .{ .once = &.{
2594 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },3025 .{ ._, .vp_d, .add, .dst0x, .src0x, .src1x, ._ },
2595 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
2596 .{ ._, .v_ps, .add, .dst0x, .dst0x, .tmp0x, ._ },
2597 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
2598 } },3026 } },
2599 }, .{3027 }, .{
2600 .required_features = .{ .f16c, null, null, null },3028 .required_features = .{ .sse2, null, null, null },
2601 .src_constraints = .{3029 .src_constraints = .{
2602 .{ .scalar_float = .{ .of = .xword, .is = .word } },3030 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
2603 .{ .scalar_float = .{ .of = .xword, .is = .word } },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 } },
2604 .any,4438 .any,
2605 },4439 },
2606 .patterns = &.{4440 .patterns = &.{
2607 .{ .src = .{ .mem, .mem, .none } },
2608 .{ .src = .{ .to_sse, .mem, .none } },4441 .{ .src = .{ .to_sse, .mem, .none } },
2609 .{ .src = .{ .mem, .to_sse, .none } },
2610 .{ .src = .{ .to_sse, .to_sse, .none } },4442 .{ .src = .{ .to_sse, .to_sse, .none } },
2611 },4443 },
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 },
2623 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },4444 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2624 .each = .{ .once = &.{4445 .each = .{ .once = &.{
2625 .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ },4446 .{ ._, .vp_b, .sub, .dst0y, .src0y, .src1y, ._ },
2626 .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ },
2627 .{ ._, .v_ps, .add, .dst0y, .dst0y, .tmp0y, ._ },
2628 .{ ._, .v_, .cvtps2ph, .dst0x, .dst0y, .rm(.{}), ._ },
2629 } },4447 } },
2630 }, .{4448 }, .{
2631 .required_features = .{ .f16c, null, null, null },4449 .required_features = .{ .avx2, null, null, null },
2632 .src_constraints = .{4450 .src_constraints = .{
2633 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },4451 .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } },
2634 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },4452 .{ .multiple_scalar_int = .{ .of = .yword, .is = .byte } },
2635 .any,4453 .any,
2636 },4454 },
2637 .patterns = &.{4455 .patterns = &.{
...@@ -2639,8 +4457,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2639,8 +4457,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2639 },4457 },
2640 .extra_temps = .{4458 .extra_temps = .{
2641 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4459 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2642 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },4460 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
2643 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },4461 .unused,
2644 .unused,4462 .unused,
2645 .unused,4463 .unused,
2646 .unused,4464 .unused,
...@@ -2649,32 +4467,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2649,32 +4467,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2649 .unused,4467 .unused,
2650 },4468 },
2651 .dst_temps = .{ .mem, .unused },4469 .dst_temps = .{ .mem, .unused },
2652 .clobbers = .{ .eflags = true },
2653 .each = .{ .once = &.{4470 .each = .{ .once = &.{
2654 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4471 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2655 .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },4472 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
2656 .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },4473 .{ ._, .vp_b, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
2657 .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .tmp2y, ._ },4474 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
2658 .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1y, .rm(.{}), ._ },4475 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
2659 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2660 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4476 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2661 } },4477 } },
2662 }, .{4478 }, .{
2663 .required_features = .{ .avx, null, null, null },4479 .required_features = .{ .avx, null, null, null },
2664 .src_constraints = .{4480 .src_constraints = .{
2665 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4481 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2666 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4482 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2667 .any,4483 .any,
2668 },4484 },
2669 .patterns = &.{4485 .patterns = &.{
2670 .{ .src = .{ .to_mem, .to_mem, .none } },4486 .{ .src = .{ .to_mem, .to_mem, .none } },
2671 },4487 },
2672 .call_frame = .{ .alignment = .@"16" },
2673 .extra_temps = .{4488 .extra_temps = .{
2674 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4489 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2675 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },4490 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
2676 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },4491 .unused,
2677 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },4492 .unused,
2678 .unused,4493 .unused,
2679 .unused,4494 .unused,
2680 .unused,4495 .unused,
...@@ -2682,33 +4497,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2682,33 +4497,29 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2682 .unused,4497 .unused,
2683 },4498 },
2684 .dst_temps = .{ .mem, .unused },4499 .dst_temps = .{ .mem, .unused },
2685 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
2686 .each = .{ .once = &.{4500 .each = .{ .once = &.{
2687 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4501 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2688 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },4502 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2689 .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) },4503 .{ ._, .vp_b, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
2690 .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0) },4504 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
2691 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },4505 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2692 .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ },
2693 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
2694 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4506 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2695 } },4507 } },
2696 }, .{4508 }, .{
2697 .required_features = .{ .sse4_1, null, null, null },4509 .required_features = .{ .sse2, null, null, null },
2698 .src_constraints = .{4510 .src_constraints = .{
2699 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4511 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2700 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4512 .{ .multiple_scalar_int = .{ .of = .xword, .is = .byte } },
2701 .any,4513 .any,
2702 },4514 },
2703 .patterns = &.{4515 .patterns = &.{
2704 .{ .src = .{ .to_mem, .to_mem, .none } },4516 .{ .src = .{ .to_mem, .to_mem, .none } },
2705 },4517 },
2706 .call_frame = .{ .alignment = .@"16" },
2707 .extra_temps = .{4518 .extra_temps = .{
2708 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4519 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2709 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },4520 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
2710 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },4521 .unused,
2711 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },4522 .unused,
2712 .unused,4523 .unused,
2713 .unused,4524 .unused,
2714 .unused,4525 .unused,
...@@ -2716,178 +4527,123 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2716,178 +4527,123 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2716 .unused,4527 .unused,
2717 },4528 },
2718 .dst_temps = .{ .mem, .unused },4529 .dst_temps = .{ .mem, .unused },
2719 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
2720 .each = .{ .once = &.{4530 .each = .{ .once = &.{
2721 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4531 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2722 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },4532 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2723 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },4533 .{ ._, .p_b, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
2724 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },4534 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
2725 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ },4535 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2726 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
2727 .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_unaligned_size), .tmp1x, .ui(0), ._ },
2728 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
2729 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4536 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2730 } },4537 } },
2731 }, .{4538 }, .{
2732 .required_features = .{ .sse2, null, null, null },4539 .required_features = .{ .slow_incdec, null, null, null },
2733 .src_constraints = .{4540 .src_constraints = .{
2734 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4541 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2735 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4542 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2736 .any,4543 .any,
2737 },4544 },
2738 .patterns = &.{4545 .patterns = &.{
2739 .{ .src = .{ .to_mem, .to_mem, .none } },4546 .{ .src = .{ .to_mem, .to_mem, .none } },
2740 },4547 },
2741 .call_frame = .{ .alignment = .@"16" },
2742 .extra_temps = .{4548 .extra_temps = .{
2743 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4549 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2744 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },4550 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
2745 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },4551 .unused,
2746 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },4552 .unused,
2747 .{ .type = .f16, .kind = .{ .reg = .ax } },4553 .unused,
2748 .unused,4554 .unused,
2749 .unused,4555 .unused,
2750 .unused,4556 .unused,
2751 .unused,4557 .unused,
2752 },4558 },
2753 .dst_temps = .{ .mem, .unused },4559 .dst_temps = .{ .mem, .unused },
2754 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
2755 .each = .{ .once = &.{4560 .each = .{ .once = &.{
2756 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4561 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2757 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },4562 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
2758 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },4563 .{ ._, ._, .sub, .tmp1b, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._ },
2759 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },4564 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ },
2760 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_unaligned_size), .ui(0), ._ },4565 .{ ._, ._, .add, .tmp0p, .si(1), ._, ._ },
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), ._, ._ },
2765 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4566 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2766 } },4567 } },
2767 }, .{4568 }, .{
2768 .required_features = .{ .sse, null, null, null },
2769 .src_constraints = .{4569 .src_constraints = .{
2770 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4570 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2771 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },4571 .{ .multiple_scalar_int = .{ .of = .byte, .is = .byte } },
2772 .any,4572 .any,
2773 },4573 },
2774 .patterns = &.{4574 .patterns = &.{
2775 .{ .src = .{ .to_mem, .to_mem, .none } },4575 .{ .src = .{ .to_mem, .to_mem, .none } },
2776 },4576 },
2777 .call_frame = .{ .alignment = .@"16" },
2778 .extra_temps = .{4577 .extra_temps = .{
2779 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4578 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2780 .{ .type = .f16, .kind = .{ .reg = .ax } },4579 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
2781 .{ .type = .f32, .kind = .mem },4580 .unused,
2782 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },4581 .unused,
2783 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },4582 .unused,
2784 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },4583 .unused,
2785 .unused,4584 .unused,
2786 .unused,4585 .unused,
2787 .unused,4586 .unused,
2788 },4587 },
2789 .dst_temps = .{ .mem, .unused },4588 .dst_temps = .{ .mem, .unused },
2790 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
2791 .each = .{ .once = &.{4589 .each = .{ .once = &.{
2792 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4590 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2793 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ },4591 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_unaligned_size), ._, ._ },
2794 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },4592 .{ ._, ._, .sub, .tmp1b, .memia(.src1b, .tmp0, .add_unaligned_size), ._, ._ },
2795 .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ },4593 .{ ._, ._, .mov, .memia(.dst0b, .tmp0, .add_unaligned_size), .tmp1b, ._, ._ },
2796 .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_unaligned_size), ._, ._ },4594 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
2797 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },4595 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
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, ._, ._ },
2837 } },4596 } },
2838 }, .{4597 }, .{
2839 .required_features = .{ .avx, null, null, null },4598 .required_features = .{ .avx, null, null, null },
2840 .src_constraints = .{4599 .src_constraints = .{
2841 .{ .scalar_float = .{ .of = .xword, .is = .dword } },4600 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2842 .{ .scalar_float = .{ .of = .xword, .is = .dword } },4601 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2843 .any,4602 .any,
2844 },4603 },
2845 .patterns = &.{4604 .patterns = &.{
2846 .{ .src = .{ .to_sse, .mem, .none } },4605 .{ .src = .{ .to_sse, .mem, .none } },
2847 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2848 .{ .src = .{ .to_sse, .to_sse, .none } },4606 .{ .src = .{ .to_sse, .to_sse, .none } },
2849 },4607 },
2850 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },4608 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2851 .each = .{ .once = &.{4609 .each = .{ .once = &.{
2852 .{ ._, .v_ps, .add, .dst0x, .src0x, .src1x, ._ },4610 .{ ._, .vp_w, .sub, .dst0x, .src0x, .src1x, ._ },
2853 } },4611 } },
2854 }, .{4612 }, .{
2855 .required_features = .{ .sse, null, null, null },4613 .required_features = .{ .sse2, null, null, null },
2856 .src_constraints = .{4614 .src_constraints = .{
2857 .{ .scalar_float = .{ .of = .xword, .is = .dword } },4615 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2858 .{ .scalar_float = .{ .of = .xword, .is = .dword } },4616 .{ .scalar_int = .{ .of = .xword, .is = .word } },
2859 .any,4617 .any,
2860 },4618 },
2861 .patterns = &.{4619 .patterns = &.{
2862 .{ .src = .{ .to_mut_sse, .mem, .none } },4620 .{ .src = .{ .to_mut_sse, .mem, .none } },
2863 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
2864 .{ .src = .{ .to_mut_sse, .to_sse, .none } },4621 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
2865 },4622 },
2866 .dst_temps = .{ .{ .ref = .src0 }, .unused },4623 .dst_temps = .{ .{ .ref = .src0 }, .unused },
2867 .each = .{ .once = &.{4624 .each = .{ .once = &.{
2868 .{ ._, ._ps, .add, .dst0x, .src1x, ._, ._ },4625 .{ ._, .p_w, .sub, .dst0x, .src1x, ._, ._ },
2869 } },4626 } },
2870 }, .{4627 }, .{
2871 .required_features = .{ .avx, null, null, null },4628 .required_features = .{ .avx2, null, null, null },
2872 .src_constraints = .{4629 .src_constraints = .{
2873 .{ .scalar_float = .{ .of = .yword, .is = .dword } },4630 .{ .scalar_int = .{ .of = .yword, .is = .word } },
2874 .{ .scalar_float = .{ .of = .yword, .is = .dword } },4631 .{ .scalar_int = .{ .of = .yword, .is = .word } },
2875 .any,4632 .any,
2876 },4633 },
2877 .patterns = &.{4634 .patterns = &.{
2878 .{ .src = .{ .to_sse, .mem, .none } },4635 .{ .src = .{ .to_sse, .mem, .none } },
2879 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
2880 .{ .src = .{ .to_sse, .to_sse, .none } },4636 .{ .src = .{ .to_sse, .to_sse, .none } },
2881 },4637 },
2882 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },4638 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
2883 .each = .{ .once = &.{4639 .each = .{ .once = &.{
2884 .{ ._, .v_ps, .add, .dst0y, .src0y, .src1y, ._ },4640 .{ ._, .vp_w, .sub, .dst0y, .src0y, .src1y, ._ },
2885 } },4641 } },
2886 }, .{4642 }, .{
2887 .required_features = .{ .avx, null, null, null },4643 .required_features = .{ .avx2, null, null, null },
2888 .src_constraints = .{4644 .src_constraints = .{
2889 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },4645 .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } },
2890 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },4646 .{ .multiple_scalar_int = .{ .of = .yword, .is = .word } },
2891 .any,4647 .any,
2892 },4648 },
2893 .patterns = &.{4649 .patterns = &.{
...@@ -2895,7 +4651,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2895,7 +4651,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2895 },4651 },
2896 .extra_temps = .{4652 .extra_temps = .{
2897 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4653 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2898 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },4654 .{ .type = .vector_16_u16, .kind = .{ .rc = .sse } },
2899 .unused,4655 .unused,
2900 .unused,4656 .unused,
2901 .unused,4657 .unused,
...@@ -2905,20 +4661,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2905,20 +4661,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2905 .unused,4661 .unused,
2906 },4662 },
2907 .dst_temps = .{ .mem, .unused },4663 .dst_temps = .{ .mem, .unused },
2908 .clobbers = .{ .eflags = true },
2909 .each = .{ .once = &.{4664 .each = .{ .once = &.{
2910 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4665 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2911 .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },4666 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
2912 .{ ._, .v_ps, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },4667 .{ ._, .vp_w, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
2913 .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },4668 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
2914 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },4669 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
2915 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4670 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2916 } },4671 } },
2917 }, .{4672 }, .{
2918 .required_features = .{ .sse, null, null, null },4673 .required_features = .{ .avx, null, null, null },
2919 .src_constraints = .{4674 .src_constraints = .{
2920 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },4675 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2921 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },4676 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2922 .any,4677 .any,
2923 },4678 },
2924 .patterns = &.{4679 .patterns = &.{
...@@ -2926,7 +4681,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2926,7 +4681,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2926 },4681 },
2927 .extra_temps = .{4682 .extra_temps = .{
2928 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4683 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2929 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },4684 .{ .type = .vector_8_u16, .kind = .{ .rc = .sse } },
2930 .unused,4685 .unused,
2931 .unused,4686 .unused,
2932 .unused,4687 .unused,
...@@ -2936,60 +4691,56 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2936,60 +4691,56 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2936 .unused,4691 .unused,
2937 },4692 },
2938 .dst_temps = .{ .mem, .unused },4693 .dst_temps = .{ .mem, .unused },
2939 .clobbers = .{ .eflags = true },
2940 .each = .{ .once = &.{4694 .each = .{ .once = &.{
2941 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4695 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
2942 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },4696 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
2943 .{ ._, ._ps, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },4697 .{ ._, .vp_w, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
2944 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },4698 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
2945 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },4699 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
2946 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4700 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
2947 } },4701 } },
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 } },
2964 }, .{4702 }, .{
2965 .required_features = .{ .sse2, null, null, null },4703 .required_features = .{ .sse2, null, null, null },
2966 .src_constraints = .{4704 .src_constraints = .{
2967 .{ .scalar_float = .{ .of = .qword, .is = .qword } },4705 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2968 .{ .scalar_float = .{ .of = .qword, .is = .qword } },4706 .{ .multiple_scalar_int = .{ .of = .xword, .is = .word } },
2969 .any,4707 .any,
2970 },4708 },
2971 .patterns = &.{4709 .patterns = &.{
2972 .{ .src = .{ .to_mut_sse, .mem, .none } },4710 .{ .src = .{ .to_mem, .to_mem, .none } },
2973 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
2974 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
2975 },4711 },
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 },
2977 .each = .{ .once = &.{4724 .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", ._, ._, ._ },
2979 } },4731 } },
2980 }, .{4732 }, .{
2981 .required_features = .{ .x87, null, null, null },
2982 .src_constraints = .{4733 .src_constraints = .{
2983 .{ .scalar_float = .{ .of = .qword, .is = .qword } },4734 .{ .multiple_scalar_int = .{ .of = .word, .is = .word } },
2984 .{ .scalar_float = .{ .of = .qword, .is = .qword } },4735 .{ .multiple_scalar_int = .{ .of = .word, .is = .word } },
2985 .any,4736 .any,
2986 },4737 },
2987 .patterns = &.{4738 .patterns = &.{
2988 .{ .src = .{ .to_mem, .to_mem, .none } },4739 .{ .src = .{ .to_mem, .to_mem, .none } },
2989 },4740 },
2990 .extra_temps = .{4741 .extra_temps = .{
2991 .{ .type = .f64, .kind = .{ .reg = .st6 } },4742 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
2992 .{ .type = .f64, .kind = .{ .reg = .st7 } },4743 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
2993 .unused,4744 .unused,
2994 .unused,4745 .unused,
2995 .unused,4746 .unused,
...@@ -3000,63 +4751,63 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3000,63 +4751,63 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3000 },4751 },
3001 .dst_temps = .{ .mem, .unused },4752 .dst_temps = .{ .mem, .unused },
3002 .each = .{ .once = &.{4753 .each = .{ .once = &.{
3003 .{ ._, .f_, .ld, .src0q, ._, ._, ._ },4754 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3004 .{ ._, .f_, .add, .src1q, ._, ._, ._ },4755 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_unaligned_size), ._, ._ },
3005 .{ ._, .f_p, .st, .dst0q, ._, ._, ._ },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", ._, ._, ._ },
3006 } },4760 } },
3007 }, .{4761 }, .{
3008 .required_features = .{ .avx, null, null, null },4762 .required_features = .{ .avx, null, null, null },
3009 .src_constraints = .{4763 .src_constraints = .{
3010 .{ .scalar_float = .{ .of = .xword, .is = .qword } },4764 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3011 .{ .scalar_float = .{ .of = .xword, .is = .qword } },4765 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3012 .any,4766 .any,
3013 },4767 },
3014 .patterns = &.{4768 .patterns = &.{
3015 .{ .src = .{ .to_sse, .mem, .none } },4769 .{ .src = .{ .to_sse, .mem, .none } },
3016 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3017 .{ .src = .{ .to_sse, .to_sse, .none } },4770 .{ .src = .{ .to_sse, .to_sse, .none } },
3018 },4771 },
3019 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },4772 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3020 .each = .{ .once = &.{4773 .each = .{ .once = &.{
3021 .{ ._, .v_pd, .add, .dst0x, .src0x, .src1x, ._ },4774 .{ ._, .vp_d, .sub, .dst0x, .src0x, .src1x, ._ },
3022 } },4775 } },
3023 }, .{4776 }, .{
3024 .required_features = .{ .sse2, null, null, null },4777 .required_features = .{ .sse2, null, null, null },
3025 .src_constraints = .{4778 .src_constraints = .{
3026 .{ .scalar_float = .{ .of = .xword, .is = .qword } },4779 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3027 .{ .scalar_float = .{ .of = .xword, .is = .qword } },4780 .{ .scalar_int = .{ .of = .xword, .is = .dword } },
3028 .any,4781 .any,
3029 },4782 },
3030 .patterns = &.{4783 .patterns = &.{
3031 .{ .src = .{ .to_mut_sse, .mem, .none } },4784 .{ .src = .{ .to_mut_sse, .mem, .none } },
3032 .{ .src = .{ .mem, .to_mut_sse, .none }, .commute = .{ 0, 1 } },
3033 .{ .src = .{ .to_mut_sse, .to_sse, .none } },4785 .{ .src = .{ .to_mut_sse, .to_sse, .none } },
3034 },4786 },
3035 .dst_temps = .{ .{ .ref = .src0 }, .unused },4787 .dst_temps = .{ .{ .ref = .src0 }, .unused },
3036 .each = .{ .once = &.{4788 .each = .{ .once = &.{
3037 .{ ._, ._pd, .add, .dst0x, .src1x, ._, ._ },4789 .{ ._, .p_d, .sub, .dst0x, .src1x, ._, ._ },
3038 } },4790 } },
3039 }, .{4791 }, .{
3040 .required_features = .{ .avx, null, null, null },4792 .required_features = .{ .avx2, null, null, null },
3041 .src_constraints = .{4793 .src_constraints = .{
3042 .{ .scalar_float = .{ .of = .yword, .is = .qword } },4794 .{ .scalar_int = .{ .of = .yword, .is = .dword } },
3043 .{ .scalar_float = .{ .of = .yword, .is = .qword } },4795 .{ .scalar_int = .{ .of = .yword, .is = .dword } },
3044 .any,4796 .any,
3045 },4797 },
3046 .patterns = &.{4798 .patterns = &.{
3047 .{ .src = .{ .to_sse, .mem, .none } },4799 .{ .src = .{ .to_sse, .mem, .none } },
3048 .{ .src = .{ .mem, .to_sse, .none }, .commute = .{ 0, 1 } },
3049 .{ .src = .{ .to_sse, .to_sse, .none } },4800 .{ .src = .{ .to_sse, .to_sse, .none } },
3050 },4801 },
3051 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },4802 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
3052 .each = .{ .once = &.{4803 .each = .{ .once = &.{
3053 .{ ._, .v_pd, .add, .dst0y, .src0y, .src1y, ._ },4804 .{ ._, .vp_d, .sub, .dst0y, .src0y, .src1y, ._ },
3054 } },4805 } },
3055 }, .{4806 }, .{
3056 .required_features = .{ .avx, null, null, null },4807 .required_features = .{ .avx2, null, null, null },
3057 .src_constraints = .{4808 .src_constraints = .{
3058 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },4809 .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } },
3059 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },4810 .{ .multiple_scalar_int = .{ .of = .yword, .is = .dword } },
3060 .any,4811 .any,
3061 },4812 },
3062 .patterns = &.{4813 .patterns = &.{
...@@ -3064,7 +4815,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3064,7 +4815,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3064 },4815 },
3065 .extra_temps = .{4816 .extra_temps = .{
3066 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4817 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3067 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },4818 .{ .type = .vector_8_u32, .kind = .{ .rc = .sse } },
3068 .unused,4819 .unused,
3069 .unused,4820 .unused,
3070 .unused,4821 .unused,
...@@ -3074,20 +4825,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3074,20 +4825,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3074 .unused,4825 .unused,
3075 },4826 },
3076 .dst_temps = .{ .mem, .unused },4827 .dst_temps = .{ .mem, .unused },
3077 .clobbers = .{ .eflags = true },
3078 .each = .{ .once = &.{4828 .each = .{ .once = &.{
3079 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4829 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3080 .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },4830 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
3081 .{ ._, .v_pd, .add, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },4831 .{ ._, .vp_d, .sub, .tmp1y, .tmp1y, .memia(.src1y, .tmp0, .add_unaligned_size), ._ },
3082 .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },4832 .{ ._, .v_dqa, .mov, .memia(.dst0y, .tmp0, .add_unaligned_size), .tmp1y, ._, ._ },
3083 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },4833 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
3084 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4834 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3085 } },4835 } },
3086 }, .{4836 }, .{
3087 .required_features = .{ .sse2, null, null, null },4837 .required_features = .{ .avx, null, null, null },
3088 .src_constraints = .{4838 .src_constraints = .{
3089 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },4839 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3090 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },4840 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3091 .any,4841 .any,
3092 },4842 },
3093 .patterns = &.{4843 .patterns = &.{
...@@ -3095,7 +4845,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3095,7 +4845,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3095 },4845 },
3096 .extra_temps = .{4846 .extra_temps = .{
3097 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4847 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3098 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },4848 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
3099 .unused,4849 .unused,
3100 .unused,4850 .unused,
3101 .unused,4851 .unused,
...@@ -3105,20 +4855,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3105,20 +4855,19 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3105 .unused,4855 .unused,
3106 },4856 },
3107 .dst_temps = .{ .mem, .unused },4857 .dst_temps = .{ .mem, .unused },
3108 .clobbers = .{ .eflags = true },
3109 .each = .{ .once = &.{4858 .each = .{ .once = &.{
3110 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4859 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3111 .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },4860 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3112 .{ ._, ._pd, .add, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },4861 .{ ._, .vp_d, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
3113 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },4862 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3114 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },4863 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3115 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4864 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3116 } },4865 } },
3117 }, .{4866 }, .{
3118 .required_features = .{ .x87, null, null, null },4867 .required_features = .{ .sse2, null, null, null },
3119 .src_constraints = .{4868 .src_constraints = .{
3120 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },4869 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3121 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },4870 .{ .multiple_scalar_int = .{ .of = .xword, .is = .dword } },
3122 .any,4871 .any,
3123 },4872 },
3124 .patterns = &.{4873 .patterns = &.{
...@@ -3126,8 +4875,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3126,8 +4875,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3126 },4875 },
3127 .extra_temps = .{4876 .extra_temps = .{
3128 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },4877 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3129 .{ .type = .f64, .kind = .{ .reg = .st6 } },4878 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
3130 .{ .type = .f64, .kind = .{ .reg = .st7 } },4879 .unused,
3131 .unused,4880 .unused,
3132 .unused,4881 .unused,
3133 .unused,4882 .unused,
...@@ -3138,25 +4887,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3138,25 +4887,24 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3138 .dst_temps = .{ .mem, .unused },4887 .dst_temps = .{ .mem, .unused },
3139 .each = .{ .once = &.{4888 .each = .{ .once = &.{
3140 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },4889 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3141 .{ .@"0:", .f_, .ld, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ },4890 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3142 .{ ._, .f_, .add, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._, ._ },4891 .{ ._, .p_d, .sub, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },
3143 .{ ._, .f_p, .st, .memia(.dst0q, .tmp0, .add_unaligned_size), ._, ._, ._ },4892 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3144 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },4893 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3145 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },4894 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3146 } },4895 } },
3147 }, .{4896 }, .{
3148 .required_features = .{ .x87, null, null, null },
3149 .src_constraints = .{4897 .src_constraints = .{
3150 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },4898 .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } },
3151 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },4899 .{ .multiple_scalar_int = .{ .of = .dword, .is = .dword } },
3152 .any,4900 .any,
3153 },4901 },
3154 .patterns = &.{4902 .patterns = &.{
3155 .{ .src = .{ .mem, .mem, .none } },4903 .{ .src = .{ .to_mem, .to_mem, .none } },
3156 },4904 },
3157 .extra_temps = .{4905 .extra_temps = .{
3158 .{ .type = .f80, .kind = .{ .reg = .st6 } },4906 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3159 .{ .type = .f80, .kind = .{ .reg = .st7 } },4907 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3160 .unused,4908 .unused,
3161 .unused,4909 .unused,
3162 .unused,4910 .unused,
...@@ -3165,28 +4913,73 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3165,28 +4913,73 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3165 .unused,4913 .unused,
3166 .unused,4914 .unused,
3167 },4915 },
3168 .dst_temps = .{ .{ .rc = .x87 }, .unused },4916 .dst_temps = .{ .mem, .unused },
3169 .each = .{ .once = &.{4917 .each = .{ .once = &.{
3170 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },4918 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3171 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },4919 .{ .@"0:", ._, .mov, .tmp1d, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ },
3172 .{ ._, .f_p, .add, ._, ._, ._, ._ },4920 .{ ._, ._, .sub, .tmp1d, .memia(.src1d, .tmp0, .add_unaligned_size), ._, ._ },
3173 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },4921 .{ ._, ._, .mov, .memia(.dst0d, .tmp0, .add_unaligned_size), .tmp1d, ._, ._ },
4922 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
4923 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3174 } },4924 } },
3175 }, .{4925 }, .{
3176 .required_features = .{ .x87, null, null, null },4926 .required_features = .{ .avx, null, null, null },
3177 .src_constraints = .{4927 .src_constraints = .{
3178 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },4928 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
3179 .{ .scalar_float = .{ .of = .xword, .is = .tbyte } },4929 .{ .scalar_int = .{ .of = .xword, .is = .qword } },
3180 .any,4930 .any,
3181 },4931 },
3182 .patterns = &.{4932 .patterns = &.{
3183 .{ .src = .{ .to_x87, .mem, .none }, .commute = .{ 0, 1 } },4933 .{ .src = .{ .to_sse, .mem, .none } },
3184 .{ .src = .{ .mem, .to_x87, .none } },4934 .{ .src = .{ .to_sse, .to_sse, .none } },
3185 .{ .src = .{ .to_x87, .to_x87, .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 } },
3186 },4979 },
3187 .extra_temps = .{4980 .extra_temps = .{
3188 .{ .type = .f80, .kind = .{ .reg = .st7 } },4981 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3189 .unused,4982 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
3190 .unused,4983 .unused,
3191 .unused,4984 .unused,
3192 .unused,4985 .unused,
...@@ -3195,17 +4988,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3195,17 +4988,20 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3195 .unused,4988 .unused,
3196 .unused,4989 .unused,
3197 },4990 },
3198 .dst_temps = .{ .{ .rc = .x87 }, .unused },4991 .dst_temps = .{ .mem, .unused },
3199 .each = .{ .once = &.{4992 .each = .{ .once = &.{
3200 .{ ._, .f_, .ld, .src0t, ._, ._, ._ },4993 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3201 .{ ._, .f_, .add, .tmp0t, .src1t, ._, ._ },4994 .{ .@"0:", .v_dqa, .mov, .tmp1y, .memia(.src0y, .tmp0, .add_unaligned_size), ._, ._ },
3202 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },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", ._, ._, ._ },
3203 } },4999 } },
3204 }, .{5000 }, .{
3205 .required_features = .{ .x87, null, null, null },5001 .required_features = .{ .avx, null, null, null },
3206 .src_constraints = .{5002 .src_constraints = .{
3207 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },5003 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3208 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },5004 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3209 .any,5005 .any,
3210 },5006 },
3211 .patterns = &.{5007 .patterns = &.{
...@@ -3213,8 +5009,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3213,8 +5009,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3213 },5009 },
3214 .extra_temps = .{5010 .extra_temps = .{
3215 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },5011 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3216 .{ .type = .f80, .kind = .{ .reg = .st6 } },5012 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
3217 .{ .type = .f80, .kind = .{ .reg = .st7 } },5013 .unused,
3218 .unused,5014 .unused,
3219 .unused,5015 .unused,
3220 .unused,5016 .unused,
...@@ -3225,27 +5021,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3225,27 +5021,25 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3225 .dst_temps = .{ .mem, .unused },5021 .dst_temps = .{ .mem, .unused },
3226 .each = .{ .once = &.{5022 .each = .{ .once = &.{
3227 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },5023 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3228 .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ },5024 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
3229 .{ ._, .f_, .ld, .memia(.src1t, .tmp0, .add_unaligned_size), ._, ._, ._ },5025 .{ ._, .vp_q, .sub, .tmp1x, .tmp1x, .memia(.src1x, .tmp0, .add_unaligned_size), ._ },
3230 .{ ._, .f_p, .add, ._, ._, ._, ._ },5026 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },
3231 .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_unaligned_size), ._, ._, ._ },
3232 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },5027 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3233 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5028 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3234 } },5029 } },
3235 }, .{5030 }, .{
3236 .required_features = .{ .sse, null, null, null },5031 .required_features = .{ .sse2, null, null, null },
3237 .src_constraints = .{5032 .src_constraints = .{
3238 .{ .scalar_float = .{ .of = .xword, .is = .xword } },5033 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3239 .{ .scalar_float = .{ .of = .xword, .is = .xword } },5034 .{ .multiple_scalar_int = .{ .of = .xword, .is = .qword } },
3240 .any,5035 .any,
3241 },5036 },
3242 .patterns = &.{5037 .patterns = &.{
3243 .{ .src = .{ .{ .to_reg = .xmm0 }, .{ .to_reg = .xmm1 }, .none } },5038 .{ .src = .{ .to_mem, .to_mem, .none } },
3244 },5039 },
3245 .call_frame = .{ .alignment = .@"16" },
3246 .extra_temps = .{5040 .extra_temps = .{
3247 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },5041 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3248 .unused,5042 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
3249 .unused,5043 .unused,
3250 .unused,5044 .unused,
3251 .unused,5045 .unused,
...@@ -3254,27 +5048,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3254,27 +5048,30 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3254 .unused,5048 .unused,
3255 .unused,5049 .unused,
3256 },5050 },
3257 .dst_temps = .{ .{ .ref = .src0 }, .unused },5051 .dst_temps = .{ .mem, .unused },
3258 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3259 .each = .{ .once = &.{5052 .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", ._, ._, ._ },
3261 } },5059 } },
3262 }, .{5060 }, .{
3263 .required_features = .{ .avx, null, null, null },5061 .required_features = .{ .@"64bit", null, null, null },
3264 .src_constraints = .{5062 .src_constraints = .{
3265 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },5063 .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } },
3266 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },5064 .{ .multiple_scalar_int = .{ .of = .qword, .is = .qword } },
3267 .any,5065 .any,
3268 },5066 },
3269 .patterns = &.{5067 .patterns = &.{
3270 .{ .src = .{ .to_mem, .to_mem, .none } },5068 .{ .src = .{ .to_mem, .to_mem, .none } },
3271 },5069 },
3272 .call_frame = .{ .alignment = .@"16" },
3273 .extra_temps = .{5070 .extra_temps = .{
3274 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },5071 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3275 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },5072 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
3276 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },5073 .unused,
3277 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },5074 .unused,
3278 .unused,5075 .unused,
3279 .unused,5076 .unused,
3280 .unused,5077 .unused,
...@@ -3282,100 +5079,88 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3282,100 +5079,88 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3282 .unused,5079 .unused,
3283 },5080 },
3284 .dst_temps = .{ .mem, .unused },5081 .dst_temps = .{ .mem, .unused },
3285 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3286 .each = .{ .once = &.{5082 .each = .{ .once = &.{
3287 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },5083 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },
3288 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },5084 .{ .@"0:", ._, .mov, .tmp1q, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ },
3289 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },5085 .{ ._, ._, .sub, .tmp1q, .memia(.src1q, .tmp0, .add_unaligned_size), ._, ._ },
3290 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },5086 .{ ._, ._, .mov, .memia(.dst0q, .tmp0, .add_unaligned_size), .tmp1q, ._, ._ },
3291 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },5087 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
3292 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
3293 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5088 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3294 } },5089 } },
3295 }, .{5090 }, .{
3296 .required_features = .{ .sse2, null, null, null },5091 .required_features = .{ .@"64bit", null, null, null },
3297 .src_constraints = .{5092 .src_constraints = .{
3298 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },5093 .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } },
3299 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },5094 .{ .scalar_remainder_int = .{ .of = .qword, .is = .qword } },
3300 .any,5095 .any,
3301 },5096 },
3302 .patterns = &.{5097 .patterns = &.{
3303 .{ .src = .{ .to_mem, .to_mem, .none } },5098 .{ .src = .{ .to_mem, .to_mem, .none } },
3304 },5099 },
3305 .call_frame = .{ .alignment = .@"16" },
3306 .extra_temps = .{5100 .extra_temps = .{
3307 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },5101 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3308 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },5102 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3309 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },5103 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3310 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },5104 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3311 .unused,5105 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3312 .unused,5106 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
3313 .unused,5107 .unused,
3314 .unused,5108 .unused,
3315 .unused,5109 .unused,
3316 },5110 },
3317 .dst_temps = .{ .mem, .unused },5111 .dst_temps = .{ .mem, .unused },
3318 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3319 .each = .{ .once = &.{5112 .each = .{ .once = &.{
3320 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },5113 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3321 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },5114 .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_add_elem_size), ._, ._ },
3322 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },5115 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_add_elem_size), ._, ._ },
3323 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },5116 .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size_add_elem_size), ._, ._ },
3324 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },5117 .{ ._, ._, .mov, .tmp4p, .sa(.src0, .sub_elem_size_div_8), ._, ._ },
3325 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },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), ._, ._ },
3326 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5125 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3327 } },5126 } },
3328 }, .{5127 }, .{
3329 .required_features = .{ .sse, null, null, null },
3330 .src_constraints = .{5128 .src_constraints = .{
3331 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },5129 .{ .scalar_remainder_int = .{ .of = .dword, .is = .dword } },
3332 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },5130 .{ .scalar_remainder_int = .{ .of = .dword, .is = .dword } },
3333 .any,5131 .any,
3334 },5132 },
3335 .patterns = &.{5133 .patterns = &.{
3336 .{ .src = .{ .to_mem, .to_mem, .none } },5134 .{ .src = .{ .to_mem, .to_mem, .none } },
3337 },5135 },
3338 .call_frame = .{ .alignment = .@"16" },
3339 .extra_temps = .{5136 .extra_temps = .{
3340 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },5137 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3341 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },5138 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3342 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },5139 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3343 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },5140 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
3344 .unused,5141 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
3345 .unused,5142 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
3346 .unused,5143 .unused,
3347 .unused,5144 .unused,
3348 .unused,5145 .unused,
3349 },5146 },
3350 .dst_temps = .{ .mem, .unused },5147 .dst_temps = .{ .mem, .unused },
3351 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
3352 .each = .{ .once = &.{5148 .each = .{ .once = &.{
3353 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_unaligned_size), ._, ._ },5149 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
3354 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },5150 .{ .@"0:", ._, .lea, .tmp1p, .memia(.src0, .tmp0, .add_size_add_elem_size), ._, ._ },
3355 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_unaligned_size), ._, ._ },5151 .{ ._, ._, .lea, .tmp2p, .memia(.src1, .tmp0, .add_size_add_elem_size), ._, ._ },
3356 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },5152 .{ ._, ._, .lea, .tmp3p, .memia(.dst0, .tmp0, .add_size_add_elem_size), ._, ._ },
3357 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_unaligned_size), .tmp1x, ._, ._ },5153 .{ ._, ._, .mov, .tmp4p, .sa(.src0, .sub_elem_size_div_4), ._, ._ },
3358 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },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), ._, ._ },
3359 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },5161 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
3360 } },5162 } },
3361 } }) catch |err| switch (err) {5163 }, .{
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 &.{ .{
3379 .required_features = .{ .f16c, null, null, null },5164 .required_features = .{ .f16c, null, null, null },
3380 .src_constraints = .{5165 .src_constraints = .{
3381 .{ .scalar_float = .{ .of = .word, .is = .word } },5166 .{ .scalar_float = .{ .of = .word, .is = .word } },
...@@ -89330,6 +91115,7 @@ const Select = struct {...@@ -89330,6 +91115,7 @@ const Select = struct {
89330 size,91115 size,
89331 delta_size,91116 delta_size,
89332 delta_elem_size,91117 delta_elem_size,
91118 size_add_elem_size,
89333 size_sub_elem_size,91119 size_sub_elem_size,
89334 unaligned_size,91120 unaligned_size,
89335 bit_size,91121 bit_size,
...@@ -89361,6 +91147,7 @@ const Select = struct {...@@ -89361,6 +91147,7 @@ const Select = struct {
89361 const add_delta_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_size, .op = .div, .rhs = .@"8" };91147 const add_delta_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_size, .op = .div, .rhs = .@"8" };
89362 const add_delta_elem_size: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .mul, .rhs = .@"1" };91148 const add_delta_elem_size: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .mul, .rhs = .@"1" };
89363 const add_delta_elem_size_div_8: Adjust = .{ .sign = .pos, .lhs = .delta_elem_size, .op = .div, .rhs = .@"8" };91149 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" };
89364 const add_size_sub_elem_size: Adjust = .{ .sign = .pos, .lhs = .size_sub_elem_size, .op = .mul, .rhs = .@"1" };91151 const add_size_sub_elem_size: Adjust = .{ .sign = .pos, .lhs = .size_sub_elem_size, .op = .mul, .rhs = .@"1" };
89365 const add_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };91152 const add_unaligned_size: Adjust = .{ .sign = .pos, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };
89366 const sub_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };91153 const sub_unaligned_size: Adjust = .{ .sign = .neg, .lhs = .unaligned_size, .op = .mul, .rhs = .@"1" };
...@@ -89377,8 +91164,11 @@ const Select = struct {...@@ -89377,8 +91164,11 @@ const Select = struct {
89377 const add_2_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"2" };91164 const add_2_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"2" };
89378 const add_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"1" };91165 const add_len: Adjust = .{ .sign = .pos, .lhs = .len, .op = .mul, .rhs = .@"1" };
89379 const sub_len: Adjust = .{ .sign = .neg, .lhs = .len, .op = .mul, .rhs = .@"1" };91166 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" };
89381 const add_8_elem_size: Adjust = .{ .sign = .pos, .lhs = .elem_size, .op = .mul, .rhs = .@"8" };91167 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" };
89382 const add_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"1" };91172 const add_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"1" };
89383 const add_2_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"2" };91173 const add_2_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"2" };
89384 const add_4_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"4" };91174 const add_4_src0_elem_size: Adjust = .{ .sign = .pos, .lhs = .src0_elem_size, .op = .mul, .rhs = .@"4" };
...@@ -89940,6 +91730,10 @@ const Select = struct {...@@ -89940,6 +91730,10 @@ const Select = struct {
89940 @as(SignedImm, @intCast(op.index.ref.typeOf(s).abiSize(s.cg.pt.zcu)))),91730 @as(SignedImm, @intCast(op.index.ref.typeOf(s).abiSize(s.cg.pt.zcu)))),
89941 .delta_elem_size => @intCast(@as(SignedImm, @intCast(op.base.ref.typeOf(s).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu))) -91731 .delta_elem_size => @intCast(@as(SignedImm, @intCast(op.base.ref.typeOf(s).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu))) -
89942 @as(SignedImm, @intCast(op.index.ref.typeOf(s).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu)))),91732 @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 },
89943 .size_sub_elem_size => {91737 .size_sub_elem_size => {
89944 const ty = op.base.ref.typeOf(s);91738 const ty = op.base.ref.typeOf(s);
89945 break :lhs @intCast(ty.abiSize(s.cg.pt.zcu) - ty.elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu));91739 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 {...@@ -33,6 +33,17 @@ fn Scalar(comptime Type: type) type {
33 .vector => |info| info.child,33 .vector => |info| info.child,
34 };34 };
35}35}
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}
36// inline to avoid a runtime `@splat`47// inline to avoid a runtime `@splat`
37inline fn splat(comptime Type: type, scalar: Scalar(Type)) Type {48inline fn splat(comptime Type: type, scalar: Scalar(Type)) Type {
38 return switch (@typeInfo(Type)) {49 return switch (@typeInfo(Type)) {
...@@ -18950,22 +18961,36 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela...@@ -18950,22 +18961,36 @@ fn binary(comptime op: anytype, comptime opts: struct { compare: Compare = .rela
18950 };18961 };
18951}18962}
1895218963
18953inline fn add(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs + rhs) {18964inline fn addUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
18954 return lhs + rhs;18965 @setRuntimeSafety(false);
18966 return @as(AddOneBit(Type), lhs) + rhs;
18955}18967}
18956test add {18968test addUnsafe {
18957 const test_add = binary(add, .{});18969 const test_add_unsafe = binary(addUnsafe, .{});
18958 try test_add.testFloats();18970 try test_add_unsafe.testInts();
18959 try test_add.testFloatVectors();18971 try test_add_unsafe.testIntVectors();
18972 try test_add_unsafe.testFloats();
18973 try test_add_unsafe.testFloatVectors();
18960}18974}
1896118975
18962inline fn subtract(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs - rhs) {18976inline fn subUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
18963 return lhs - rhs;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;
18964}18987}
18965test subtract {18988test subUnsafe {
18966 const test_subtract = binary(subtract, .{});18989 const test_sub_unsafe = binary(subUnsafe, .{});
18967 try test_subtract.testFloats();18990 try test_sub_unsafe.testInts();
18968 try test_subtract.testFloatVectors();18991 try test_sub_unsafe.testIntVectors();
18992 try test_sub_unsafe.testFloats();
18993 try test_sub_unsafe.testFloatVectors();
18969}18994}
1897018995
18971inline fn multiply(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs * rhs) {18996inline fn multiply(comptime Type: type, lhs: Type, rhs: Type) @TypeOf(lhs * rhs) {