authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-24 15:21:42-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-28 15:10:22-04:00
logd1785cf61c2b7db5553532cb62cb058d99e2c7b0
tree2e90003ab3ea3d7a038da110c3d2b9fc417c4bdf
parenta4a1ebdeed16494270a0111aeee6fec8e04ef7ee

x86_64: implement strict float `@reduce(.Add)`


2 files changed, 862 insertions(+), 14 deletions(-)

src/arch/x86_64/CodeGen.zig+861-14
......@@ -2389,7 +2389,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
23892389}
23902390
23912391fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2392 @setEvalBranchQuota(23_800);
2392 @setEvalBranchQuota(23_900);
23932393 const pt = cg.pt;
23942394 const zcu = pt.zcu;
23952395 const ip = &zcu.intern_pool;
......@@ -117442,7 +117442,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
117442117442 switch (reduce.operation) {
117443117443 .And, .Or, .Xor => {},
117444117444 .Min, .Max => break :fallback try cg.airReduce(inst),
117445 .Add, .Mul => if (cg.floatBits(res_ty)) |_| break :fallback try cg.airReduce(inst),
117445 .Add => {},
117446 .Mul => if (cg.floatBits(res_ty)) |_| break :fallback try cg.airReduce(inst),
117446117447 }
117447117448 var ops = try cg.tempsFromOperands(inst, .{reduce.operand});
117448117449 var res: [1]Temp = undefined;
......@@ -126545,6 +126546,852 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
126545126546 .{ ._, ._, .sub, .tmp0d, .sa(.dst0, .add_size), ._, ._ },
126546126547 .{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
126547126548 } },
126549 }, .{
126550 .required_features = .{ .f16c, .fast_hops, null, null },
126551 .dst_constraints = .{ .{ .float = .word }, .any },
126552 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .dword, .is = .word } }, .any, .any },
126553 .patterns = &.{
126554 .{ .src = .{ .mem, .none, .none } },
126555 .{ .src = .{ .to_sse, .none, .none } },
126556 },
126557 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126558 .each = .{ .once = &.{
126559 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
126560 .{ ._, .vh_ps, .add, .dst0x, .dst0x, .dst0x, ._ },
126561 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
126562 } },
126563 }, .{
126564 .required_features = .{ .f16c, null, null, null },
126565 .dst_constraints = .{ .{ .float = .word }, .any },
126566 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .dword, .is = .word } }, .any, .any },
126567 .patterns = &.{
126568 .{ .src = .{ .mem, .none, .none } },
126569 .{ .src = .{ .to_sse, .none, .none } },
126570 },
126571 .extra_temps = .{
126572 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126573 .unused,
126574 .unused,
126575 .unused,
126576 .unused,
126577 .unused,
126578 .unused,
126579 .unused,
126580 .unused,
126581 .unused,
126582 .unused,
126583 },
126584 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126585 .each = .{ .once = &.{
126586 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
126587 .{ ._, .v_ps, .shuf, .tmp0x, .dst0x, .dst0x, .ui(0b01_01_01_01) },
126588 .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0x, ._ },
126589 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
126590 } },
126591 }, .{
126592 .required_features = .{ .f16c, .fast_hops, null, null },
126593 .dst_constraints = .{ .{ .float = .word }, .any },
126594 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .qword, .is = .word } }, .any, .any },
126595 .patterns = &.{
126596 .{ .src = .{ .mem, .none, .none } },
126597 .{ .src = .{ .to_sse, .none, .none } },
126598 },
126599 .extra_temps = .{
126600 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126601 .unused,
126602 .unused,
126603 .unused,
126604 .unused,
126605 .unused,
126606 .unused,
126607 .unused,
126608 .unused,
126609 .unused,
126610 .unused,
126611 },
126612 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126613 .each = .{ .once = &.{
126614 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
126615 .{ ._, .vh_ps, .add, .tmp0x, .dst0x, .dst0x, ._ },
126616 .{ ._, .v_ps, .shuf, .dst0x, .dst0x, .dst0x, .ui(0b11_10_11_10) },
126617 .{ ._, .v_ss, .add, .dst0x, .tmp0x, .dst0x, ._ },
126618 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
126619 } },
126620 }, .{
126621 .required_features = .{ .f16c, null, null, null },
126622 .dst_constraints = .{ .{ .float = .word }, .any },
126623 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .qword, .is = .word } }, .any, .any },
126624 .patterns = &.{
126625 .{ .src = .{ .mem, .none, .none } },
126626 .{ .src = .{ .to_sse, .none, .none } },
126627 },
126628 .extra_temps = .{
126629 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126630 .unused,
126631 .unused,
126632 .unused,
126633 .unused,
126634 .unused,
126635 .unused,
126636 .unused,
126637 .unused,
126638 .unused,
126639 .unused,
126640 },
126641 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126642 .each = .{ .once = &.{
126643 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
126644 .{ ._, .v_ps, .shuf, .tmp0x, .dst0x, .dst0x, .ui(0b11_10_11_10) },
126645 .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0x, ._ },
126646 .{ ._, .v_ps, .shuf, .tmp0x, .dst0x, .dst0x, .ui(0b01_01_01_01) },
126647 .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp0x, ._ },
126648 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
126649 } },
126650 }, .{
126651 .required_features = .{ .f16c, .fast_hops, null, null },
126652 .dst_constraints = .{ .{ .float = .word }, .any },
126653 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
126654 .patterns = &.{
126655 .{ .src = .{ .to_mem, .none, .none } },
126656 },
126657 .extra_temps = .{
126658 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
126659 .{ .type = .f16, .kind = .{ .rc = .sse } },
126660 .unused,
126661 .unused,
126662 .unused,
126663 .unused,
126664 .unused,
126665 .unused,
126666 .unused,
126667 .unused,
126668 .unused,
126669 },
126670 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
126671 .clobbers = .{ .eflags = true },
126672 .each = .{ .once = &.{
126673 .{ ._, .vp_, .xor, .dst0x, .dst0x, .dst0x, ._ },
126674 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
126675 .{ ._, .vp_w, .insr, .dst0x, .dst0x, .mem(.src0w), .ui(0) },
126676 .{ .@"0:", .vp_w, .insr, .dst0x, .dst0x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(1) },
126677 .{ ._, .v_ps, .cvtph2, .dst0x, .dst0q, ._, ._ },
126678 .{ ._, .vh_ps, .add, .dst0x, .dst0x, .dst0x, ._ },
126679 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
126680 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
126681 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
126682 } },
126683 }, .{
126684 .required_features = .{ .f16c, null, null, null },
126685 .dst_constraints = .{ .{ .float = .word }, .any },
126686 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
126687 .patterns = &.{
126688 .{ .src = .{ .to_mem, .none, .none } },
126689 },
126690 .extra_temps = .{
126691 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
126692 .{ .type = .f16, .kind = .{ .rc = .sse } },
126693 .unused,
126694 .unused,
126695 .unused,
126696 .unused,
126697 .unused,
126698 .unused,
126699 .unused,
126700 .unused,
126701 .unused,
126702 },
126703 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
126704 .clobbers = .{ .eflags = true },
126705 .each = .{ .once = &.{
126706 .{ ._, .vp_, .xor, .dst0x, .dst0x, .dst0x, ._ },
126707 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
126708 .{ ._, .vp_w, .insr, .dst0x, .dst0x, .mem(.src0w), .ui(0) },
126709 .{ .@"0:", .vp_w, .insr, .dst0x, .dst0x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(1) },
126710 .{ ._, .v_ps, .cvtph2, .dst0x, .dst0q, ._, ._ },
126711 .{ ._, .v_ps, .shuf, .tmp1x, .dst0x, .dst0x, .ui(0b01_01_01_01) },
126712 .{ ._, .v_ss, .add, .dst0x, .dst0x, .tmp1x, ._ },
126713 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
126714 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
126715 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
126716 } },
126717 }, .{
126718 .required_features = .{ .avx, null, null, null },
126719 .dst_constraints = .{ .{ .float = .word }, .any },
126720 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
126721 .patterns = &.{
126722 .{ .src = .{ .to_mem, .none, .none } },
126723 },
126724 .call_frame = .{ .alignment = .@"16" },
126725 .extra_temps = .{
126726 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
126727 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
126728 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
126729 .unused,
126730 .unused,
126731 .unused,
126732 .unused,
126733 .unused,
126734 .unused,
126735 .unused,
126736 .unused,
126737 },
126738 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
126739 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
126740 .each = .{ .once = &.{
126741 .{ ._, .vp_, .xor, .dst0x, .dst0x, .dst0x, ._ },
126742 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
126743 .{ ._, .vp_w, .insr, .dst0x, .dst0x, .mem(.src0w), .ui(0) },
126744 .{ .@"0:", .vp_, .xor, .tmp1x, .tmp1x, .tmp1x, ._ },
126745 .{ ._, .vp_w, .insr, .tmp1x, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0) },
126746 .{ ._, ._, .call, .tmp2d, ._, ._, ._ },
126747 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
126748 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
126749 } },
126750 }, .{
126751 .required_features = .{ .sse2, null, null, null },
126752 .dst_constraints = .{ .{ .float = .word }, .any },
126753 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
126754 .patterns = &.{
126755 .{ .src = .{ .to_mem, .none, .none } },
126756 },
126757 .call_frame = .{ .alignment = .@"16" },
126758 .extra_temps = .{
126759 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
126760 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
126761 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
126762 .unused,
126763 .unused,
126764 .unused,
126765 .unused,
126766 .unused,
126767 .unused,
126768 .unused,
126769 .unused,
126770 },
126771 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
126772 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
126773 .each = .{ .once = &.{
126774 .{ ._, .p_, .xor, .dst0x, .dst0x, ._, ._ },
126775 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
126776 .{ ._, .p_w, .insr, .dst0x, .mem(.src0w), .ui(0), ._ },
126777 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
126778 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_unaligned_size), .ui(0), ._ },
126779 .{ ._, ._, .call, .tmp2d, ._, ._, ._ },
126780 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
126781 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
126782 } },
126783 }, .{
126784 .required_features = .{ .sse, null, null, null },
126785 .dst_constraints = .{ .{ .float = .word }, .any },
126786 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .word, .is = .word } }, .any, .any },
126787 .patterns = &.{
126788 .{ .src = .{ .to_mem, .none, .none } },
126789 },
126790 .call_frame = .{ .alignment = .@"16" },
126791 .extra_temps = .{
126792 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
126793 .{ .type = .f16, .kind = .{ .reg = .ax } },
126794 .{ .type = .f32, .kind = .mem },
126795 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
126796 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addhf3" } } },
126797 .unused,
126798 .unused,
126799 .unused,
126800 .unused,
126801 .unused,
126802 .unused,
126803 },
126804 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
126805 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
126806 .each = .{ .once = &.{
126807 .{ ._, ._ps, .xor, .dst0x, .dst0x, ._, ._ },
126808 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_unaligned_size), ._, ._ },
126809 .{ ._, ._, .movzx, .tmp1d, .mem(.src0w), ._, ._ },
126810 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
126811 .{ ._, ._ss, .mov, .dst0x, .mem(.tmp2d), ._, ._ },
126812 .{ .@"0:", ._ps, .xor, .tmp3x, .tmp3x, ._, ._ },
126813 .{ ._, ._ss, .mov, .tmp3x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ },
126814 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
126815 .{ ._, ._, .add, .tmp0p, .si(2), ._, ._ },
126816 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
126817 } },
126818 }, .{
126819 .required_features = .{ .avx, .fast_hops, null, null },
126820 .dst_constraints = .{ .{ .float = .dword }, .any },
126821 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
126822 .patterns = &.{
126823 .{ .src = .{ .to_sse, .none, .none } },
126824 },
126825 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126826 .each = .{ .once = &.{
126827 .{ ._, .vh_ps, .add, .dst0x, .src0x, .src0x, ._ },
126828 } },
126829 }, .{
126830 .required_features = .{ .avx, null, null, null },
126831 .dst_constraints = .{ .{ .float = .dword }, .any },
126832 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
126833 .patterns = &.{
126834 .{ .src = .{ .to_sse, .none, .none } },
126835 },
126836 .extra_temps = .{
126837 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126838 .unused,
126839 .unused,
126840 .unused,
126841 .unused,
126842 .unused,
126843 .unused,
126844 .unused,
126845 .unused,
126846 .unused,
126847 .unused,
126848 },
126849 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126850 .each = .{ .once = &.{
126851 .{ ._, .v_ps, .shuf, .tmp0x, .src0x, .src0x, .ui(0b01_01_01_01) },
126852 .{ ._, .v_ss, .add, .dst0x, .src0x, .tmp0x, ._ },
126853 } },
126854 }, .{
126855 .required_features = .{ .sse3, .fast_hops, null, null },
126856 .dst_constraints = .{ .{ .float = .dword }, .any },
126857 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
126858 .patterns = &.{
126859 .{ .src = .{ .to_mut_sse, .none, .none } },
126860 },
126861 .dst_temps = .{ .{ .ref = .src0 }, .unused },
126862 .each = .{ .once = &.{
126863 .{ ._, .h_ps, .add, .dst0x, .src0x, ._, ._ },
126864 } },
126865 }, .{
126866 .required_features = .{ .sse, null, null, null },
126867 .dst_constraints = .{ .{ .float = .dword }, .any },
126868 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .qword, .is = .dword } }, .any, .any },
126869 .patterns = &.{
126870 .{ .src = .{ .to_mut_sse, .none, .none } },
126871 },
126872 .extra_temps = .{
126873 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126874 .unused,
126875 .unused,
126876 .unused,
126877 .unused,
126878 .unused,
126879 .unused,
126880 .unused,
126881 .unused,
126882 .unused,
126883 .unused,
126884 },
126885 .dst_temps = .{ .{ .ref = .src0 }, .unused },
126886 .each = .{ .once = &.{
126887 .{ ._, ._ps, .mova, .tmp0x, .src0x, ._, ._ },
126888 .{ ._, ._ps, .shuf, .tmp0x, .tmp0x, .ui(0b01_01_01_01), ._ },
126889 .{ ._, ._ss, .add, .dst0x, .tmp0x, ._, ._ },
126890 } },
126891 }, .{
126892 .required_features = .{ .avx, .fast_hops, null, null },
126893 .dst_constraints = .{ .{ .float = .dword }, .any },
126894 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
126895 .patterns = &.{
126896 .{ .src = .{ .to_sse, .none, .none } },
126897 },
126898 .extra_temps = .{
126899 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126900 .unused,
126901 .unused,
126902 .unused,
126903 .unused,
126904 .unused,
126905 .unused,
126906 .unused,
126907 .unused,
126908 .unused,
126909 .unused,
126910 },
126911 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126912 .each = .{ .once = &.{
126913 .{ ._, .vh_ps, .add, .tmp0x, .src0x, .src0x, ._ },
126914 .{ ._, .v_ps, .movhl, .dst0x, .src0x, .src0x, ._ },
126915 .{ ._, .v_ss, .add, .dst0x, .tmp0x, .dst0x, ._ },
126916 } },
126917 }, .{
126918 .required_features = .{ .avx, null, null, null },
126919 .dst_constraints = .{ .{ .float = .dword }, .any },
126920 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
126921 .patterns = &.{
126922 .{ .src = .{ .to_sse, .none, .none } },
126923 },
126924 .extra_temps = .{
126925 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126926 .unused,
126927 .unused,
126928 .unused,
126929 .unused,
126930 .unused,
126931 .unused,
126932 .unused,
126933 .unused,
126934 .unused,
126935 .unused,
126936 },
126937 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
126938 .each = .{ .once = &.{
126939 .{ ._, .v_ps, .movhl, .tmp0x, .src0x, .src0x, ._ },
126940 .{ ._, .v_ps, .add, .tmp0x, .src0x, .tmp0x, ._ },
126941 .{ ._, .v_ps, .shuf, .dst0x, .src0x, .src0x, .ui(0b01_01_01_01) },
126942 .{ ._, .v_ss, .add, .dst0x, .tmp0x, .dst0x, ._ },
126943 } },
126944 }, .{
126945 .required_features = .{ .sse3, .fast_hops, null, null },
126946 .dst_constraints = .{ .{ .float = .dword }, .any },
126947 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
126948 .patterns = &.{
126949 .{ .src = .{ .to_mut_sse, .none, .none } },
126950 },
126951 .extra_temps = .{
126952 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126953 .unused,
126954 .unused,
126955 .unused,
126956 .unused,
126957 .unused,
126958 .unused,
126959 .unused,
126960 .unused,
126961 .unused,
126962 .unused,
126963 },
126964 .dst_temps = .{ .{ .ref = .src0 }, .unused },
126965 .each = .{ .once = &.{
126966 .{ ._, ._ps, .xor, .tmp0x, .tmp0x, ._, ._ },
126967 .{ ._, ._ps, .movhl, .tmp0x, .src0x, ._, ._ },
126968 .{ ._, .h_ps, .add, .dst0x, .src0x, ._, ._ },
126969 .{ ._, ._ss, .add, .dst0x, .tmp0x, ._, ._ },
126970 } },
126971 }, .{
126972 .required_features = .{ .sse, null, null, null },
126973 .dst_constraints = .{ .{ .float = .dword }, .any },
126974 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .xword, .is = .dword } }, .any, .any },
126975 .patterns = &.{
126976 .{ .src = .{ .to_mut_sse, .none, .none } },
126977 },
126978 .extra_temps = .{
126979 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
126980 .unused,
126981 .unused,
126982 .unused,
126983 .unused,
126984 .unused,
126985 .unused,
126986 .unused,
126987 .unused,
126988 .unused,
126989 .unused,
126990 },
126991 .dst_temps = .{ .{ .ref = .src0 }, .unused },
126992 .each = .{ .once = &.{
126993 .{ ._, ._ps, .xor, .tmp0x, .tmp0x, ._, ._ },
126994 .{ ._, ._ps, .movhl, .tmp0x, .src0x, ._, ._ },
126995 .{ ._, ._ss, .add, .tmp0x, .src0x, ._, ._ },
126996 .{ ._, ._ps, .shuf, .dst0x, .src0x, .ui(0b01_01_01_01), ._ },
126997 .{ ._, ._ss, .add, .dst0x, .tmp0x, ._, ._ },
126998 } },
126999 }, .{
127000 .required_features = .{ .avx, null, null, null },
127001 .dst_constraints = .{ .{ .float = .dword }, .any },
127002 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any },
127003 .patterns = &.{
127004 .{ .src = .{ .to_mem, .none, .none } },
127005 },
127006 .extra_temps = .{
127007 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127008 .unused,
127009 .unused,
127010 .unused,
127011 .unused,
127012 .unused,
127013 .unused,
127014 .unused,
127015 .unused,
127016 .unused,
127017 .unused,
127018 },
127019 .dst_temps = .{ .{ .rc = .sse }, .unused },
127020 .clobbers = .{ .eflags = true },
127021 .each = .{ .once = &.{
127022 .{ ._, ._, .mov, .tmp0p, .sia(4, .src0, .sub_unaligned_size), ._, ._ },
127023 .{ ._, .v_ss, .mov, .dst0x, .mem(.src0d), ._, ._ },
127024 .{ .@"0:", .v_ss, .add, .dst0x, .dst0x, .memia(.src0d, .tmp0, .add_unaligned_size), ._ },
127025 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
127026 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127027 } },
127028 }, .{
127029 .required_features = .{ .sse, null, null, null },
127030 .dst_constraints = .{ .{ .float = .dword }, .any },
127031 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .dword, .is = .dword } }, .any, .any },
127032 .patterns = &.{
127033 .{ .src = .{ .to_mem, .none, .none } },
127034 },
127035 .extra_temps = .{
127036 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127037 .unused,
127038 .unused,
127039 .unused,
127040 .unused,
127041 .unused,
127042 .unused,
127043 .unused,
127044 .unused,
127045 .unused,
127046 .unused,
127047 },
127048 .dst_temps = .{ .{ .rc = .sse }, .unused },
127049 .clobbers = .{ .eflags = true },
127050 .each = .{ .once = &.{
127051 .{ ._, ._, .mov, .tmp0p, .sia(4, .src0, .sub_unaligned_size), ._, ._ },
127052 .{ ._, ._ss, .mov, .dst0x, .mem(.src0d), ._, ._ },
127053 .{ .@"0:", ._ss, .add, .dst0x, .memia(.src0d, .tmp0, .add_unaligned_size), ._, ._ },
127054 .{ ._, ._, .add, .tmp0p, .si(4), ._, ._ },
127055 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127056 } },
127057 }, .{
127058 .required_features = .{ .avx, .fast_hops, null, null },
127059 .dst_constraints = .{ .{ .float = .qword }, .any },
127060 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
127061 .patterns = &.{
127062 .{ .src = .{ .to_sse, .none, .none } },
127063 },
127064 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
127065 .each = .{ .once = &.{
127066 .{ ._, .vh_pd, .add, .dst0x, .src0x, .src0x, ._ },
127067 } },
127068 }, .{
127069 .required_features = .{ .avx, null, null, null },
127070 .dst_constraints = .{ .{ .float = .qword }, .any },
127071 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
127072 .patterns = &.{
127073 .{ .src = .{ .to_sse, .none, .none } },
127074 },
127075 .extra_temps = .{
127076 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
127077 .unused,
127078 .unused,
127079 .unused,
127080 .unused,
127081 .unused,
127082 .unused,
127083 .unused,
127084 .unused,
127085 .unused,
127086 .unused,
127087 },
127088 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
127089 .each = .{ .once = &.{
127090 .{ ._, .v_ps, .movhl, .tmp0x, .src0x, .src0x, ._ },
127091 .{ ._, .v_sd, .add, .dst0x, .src0x, .tmp0x, ._ },
127092 } },
127093 }, .{
127094 .required_features = .{ .sse3, .fast_hops, null, null },
127095 .dst_constraints = .{ .{ .float = .qword }, .any },
127096 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
127097 .patterns = &.{
127098 .{ .src = .{ .to_mut_sse, .none, .none } },
127099 },
127100 .dst_temps = .{ .{ .ref = .src0 }, .unused },
127101 .each = .{ .once = &.{
127102 .{ ._, .h_pd, .add, .dst0x, .src0x, ._, ._ },
127103 } },
127104 }, .{
127105 .required_features = .{ .sse2, null, null, null },
127106 .dst_constraints = .{ .{ .float = .qword }, .any },
127107 .src_constraints = .{ .{ .exact_scalar_float = .{ .of = .xword, .is = .qword } }, .any, .any },
127108 .patterns = &.{
127109 .{ .src = .{ .to_mut_sse, .none, .none } },
127110 },
127111 .extra_temps = .{
127112 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
127113 .unused,
127114 .unused,
127115 .unused,
127116 .unused,
127117 .unused,
127118 .unused,
127119 .unused,
127120 .unused,
127121 .unused,
127122 .unused,
127123 },
127124 .dst_temps = .{ .{ .ref = .src0 }, .unused },
127125 .each = .{ .once = &.{
127126 .{ ._, ._ps, .xor, .tmp0x, .tmp0x, ._, ._ },
127127 .{ ._, ._ps, .movhl, .tmp0x, .src0x, ._, ._ },
127128 .{ ._, ._sd, .add, .dst0x, .tmp0x, ._, ._ },
127129 } },
127130 }, .{
127131 .required_features = .{ .avx, .fast_hops, null, null },
127132 .dst_constraints = .{ .{ .float = .qword }, .any },
127133 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any },
127134 .patterns = &.{
127135 .{ .src = .{ .to_sse, .none, .none } },
127136 },
127137 .extra_temps = .{
127138 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
127139 .unused,
127140 .unused,
127141 .unused,
127142 .unused,
127143 .unused,
127144 .unused,
127145 .unused,
127146 .unused,
127147 .unused,
127148 .unused,
127149 },
127150 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
127151 .each = .{ .once = &.{
127152 .{ ._, .vh_pd, .add, .tmp0x, .src0x, .src0x, ._ },
127153 .{ ._, .v_f128, .extract, .dst0x, .src0y, .ui(1), ._ },
127154 .{ ._, .v_sd, .add, .dst0x, .tmp0x, .dst0x, ._ },
127155 } },
127156 }, .{
127157 .required_features = .{ .avx, null, null, null },
127158 .dst_constraints = .{ .{ .float = .qword }, .any },
127159 .src_constraints = .{ .{ .exclusive_scalar_float = .{ .of = .yword, .is = .qword } }, .any, .any },
127160 .patterns = &.{
127161 .{ .src = .{ .to_sse, .none, .none } },
127162 },
127163 .extra_temps = .{
127164 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
127165 .unused,
127166 .unused,
127167 .unused,
127168 .unused,
127169 .unused,
127170 .unused,
127171 .unused,
127172 .unused,
127173 .unused,
127174 .unused,
127175 },
127176 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
127177 .each = .{ .once = &.{
127178 .{ ._, .v_f128, .extract, .tmp0x, .src0y, .ui(1), ._ },
127179 .{ ._, .v_pd, .add, .tmp0x, .src0x, .tmp0x, ._ },
127180 .{ ._, .v_ps, .movhl, .dst0x, .src0x, .src0x, ._ },
127181 .{ ._, .v_sd, .add, .dst0x, .tmp0x, .dst0x, ._ },
127182 } },
127183 }, .{
127184 .required_features = .{ .avx, null, null, null },
127185 .dst_constraints = .{ .{ .float = .qword }, .any },
127186 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any },
127187 .patterns = &.{
127188 .{ .src = .{ .to_mem, .none, .none } },
127189 },
127190 .extra_temps = .{
127191 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127192 .unused,
127193 .unused,
127194 .unused,
127195 .unused,
127196 .unused,
127197 .unused,
127198 .unused,
127199 .unused,
127200 .unused,
127201 .unused,
127202 },
127203 .dst_temps = .{ .{ .rc = .sse }, .unused },
127204 .clobbers = .{ .eflags = true },
127205 .each = .{ .once = &.{
127206 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_unaligned_size), ._, ._ },
127207 .{ ._, .v_sd, .mov, .dst0x, .mem(.src0q), ._, ._ },
127208 .{ .@"0:", .v_sd, .add, .dst0x, .dst0x, .memia(.src0q, .tmp0, .add_unaligned_size), ._ },
127209 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
127210 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127211 } },
127212 }, .{
127213 .required_features = .{ .sse2, null, null, null },
127214 .dst_constraints = .{ .{ .float = .qword }, .any },
127215 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any },
127216 .patterns = &.{
127217 .{ .src = .{ .to_mem, .none, .none } },
127218 },
127219 .extra_temps = .{
127220 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127221 .unused,
127222 .unused,
127223 .unused,
127224 .unused,
127225 .unused,
127226 .unused,
127227 .unused,
127228 .unused,
127229 .unused,
127230 .unused,
127231 },
127232 .dst_temps = .{ .{ .rc = .sse }, .unused },
127233 .clobbers = .{ .eflags = true },
127234 .each = .{ .once = &.{
127235 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_unaligned_size), ._, ._ },
127236 .{ ._, ._sd, .mov, .dst0x, .mem(.src0q), ._, ._ },
127237 .{ .@"0:", ._sd, .add, .dst0x, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._ },
127238 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
127239 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127240 } },
127241 }, .{
127242 .required_features = .{ .x87, null, null, null },
127243 .dst_constraints = .{ .{ .float = .qword }, .any },
127244 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } }, .any, .any },
127245 .patterns = &.{
127246 .{ .src = .{ .to_mem, .none, .none } },
127247 },
127248 .extra_temps = .{
127249 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127250 .{ .type = .f64, .kind = .{ .reg = .st7 } },
127251 .unused,
127252 .unused,
127253 .unused,
127254 .unused,
127255 .unused,
127256 .unused,
127257 .unused,
127258 .unused,
127259 .unused,
127260 },
127261 .dst_temps = .{ .mem, .unused },
127262 .clobbers = .{ .eflags = true },
127263 .each = .{ .once = &.{
127264 .{ ._, ._, .mov, .tmp0p, .sia(8, .src0, .sub_unaligned_size), ._, ._ },
127265 .{ ._, .f_, .ld, .mem(.src0q), ._, ._, ._ },
127266 .{ .@"0:", .f_, .add, .memia(.src0q, .tmp0, .add_unaligned_size), ._, ._, ._ },
127267 .{ ._, ._, .add, .tmp0p, .si(8), ._, ._ },
127268 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127269 .{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
127270 } },
127271 }, .{
127272 .required_features = .{ .x87, null, null, null },
127273 .dst_constraints = .{ .{ .float = .tbyte }, .any },
127274 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .qword, .is = .tbyte } }, .any, .any },
127275 .patterns = &.{
127276 .{ .src = .{ .to_mem, .none, .none } },
127277 },
127278 .extra_temps = .{
127279 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127280 .{ .type = .f80, .kind = .{ .reg = .st6 } },
127281 .{ .type = .f80, .kind = .{ .reg = .st7 } },
127282 .unused,
127283 .unused,
127284 .unused,
127285 .unused,
127286 .unused,
127287 .unused,
127288 .unused,
127289 .unused,
127290 },
127291 .dst_temps = .{ .mem, .unused },
127292 .clobbers = .{ .eflags = true },
127293 .each = .{ .once = &.{
127294 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
127295 .{ ._, .f_, .ld, .mem(.src0t), ._, ._, ._ },
127296 .{ .@"0:", .f_, .ld, .memia(.src0t, .tmp0, .add_unaligned_size), ._, ._, ._ },
127297 .{ ._, .f_p, .add, ._, ._, ._, ._ },
127298 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
127299 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127300 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
127301 } },
127302 }, .{
127303 .required_features = .{ .avx, null, null, null },
127304 .dst_constraints = .{ .{ .float = .xword }, .any },
127305 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any },
127306 .patterns = &.{
127307 .{ .src = .{ .to_mem, .none, .none } },
127308 },
127309 .call_frame = .{ .alignment = .@"16" },
127310 .extra_temps = .{
127311 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127312 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
127313 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
127314 .unused,
127315 .unused,
127316 .unused,
127317 .unused,
127318 .unused,
127319 .unused,
127320 .unused,
127321 .unused,
127322 },
127323 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
127324 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
127325 .each = .{ .once = &.{
127326 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
127327 .{ ._, .v_dqa, .mov, .dst0x, .mem(.src0x), ._, ._ },
127328 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
127329 .{ ._, ._, .call, .tmp2d, ._, ._, ._ },
127330 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
127331 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127332 } },
127333 }, .{
127334 .required_features = .{ .sse2, null, null, null },
127335 .dst_constraints = .{ .{ .float = .xword }, .any },
127336 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any },
127337 .patterns = &.{
127338 .{ .src = .{ .to_mem, .none, .none } },
127339 },
127340 .call_frame = .{ .alignment = .@"16" },
127341 .extra_temps = .{
127342 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127343 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
127344 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
127345 .unused,
127346 .unused,
127347 .unused,
127348 .unused,
127349 .unused,
127350 .unused,
127351 .unused,
127352 .unused,
127353 },
127354 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
127355 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
127356 .each = .{ .once = &.{
127357 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
127358 .{ ._, ._dqa, .mov, .dst0x, .mem(.src0x), ._, ._ },
127359 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
127360 .{ ._, ._, .call, .tmp2d, ._, ._, ._ },
127361 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
127362 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127363 } },
127364 }, .{
127365 .required_features = .{ .sse, null, null, null },
127366 .dst_constraints = .{ .{ .float = .xword }, .any },
127367 .src_constraints = .{ .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } }, .any, .any },
127368 .patterns = &.{
127369 .{ .src = .{ .to_mem, .none, .none } },
127370 },
127371 .call_frame = .{ .alignment = .@"16" },
127372 .extra_temps = .{
127373 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
127374 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
127375 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__addtf3" } } },
127376 .unused,
127377 .unused,
127378 .unused,
127379 .unused,
127380 .unused,
127381 .unused,
127382 .unused,
127383 .unused,
127384 },
127385 .dst_temps = .{ .{ .reg = .xmm0 }, .unused },
127386 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
127387 .each = .{ .once = &.{
127388 .{ ._, ._, .mov, .tmp0p, .sia(16, .src0, .sub_unaligned_size), ._, ._ },
127389 .{ ._, ._ps, .mova, .dst0x, .mem(.src0x), ._, ._ },
127390 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_unaligned_size), ._, ._ },
127391 .{ ._, ._, .call, .tmp2d, ._, ._, ._ },
127392 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
127393 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
127394 } },
126548127395 } },
126549127396 .Mul => comptime &.{ .{
126550127397 .required_features = .{ .avx, null, null, null },
......@@ -131596,7 +132443,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
131596132443 .{ .src = .{ .to_mem, .none, .none } },
131597132444 },
131598132445 .extra_temps = .{
131599 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
132446 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
131600132447 .{ .type = .f64, .kind = .{ .reg = .st7 } },
131601132448 .unused,
131602132449 .unused,
......@@ -131611,10 +132458,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
131611132458 .dst_temps = .{ .mem, .unused },
131612132459 .clobbers = .{ .eflags = true },
131613132460 .each = .{ .once = &.{
131614 .{ ._, ._, .mov, .tmp0p, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
132461 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
131615132462 .{ ._, .f_, .ld, .memad(.src0q, .add_unaligned_size, -8), ._, ._, ._ },
131616132463 .{ .@"0:", .f_, .add, .memi(.src0q, .tmp0), ._, ._, ._ },
131617 .{ ._, ._, .sub, .tmp0p, .si(8), ._, ._ },
132464 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
131618132465 .{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
131619132466 .{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
131620132467 } },
......@@ -131626,7 +132473,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
131626132473 .{ .src = .{ .to_mem, .none, .none } },
131627132474 },
131628132475 .extra_temps = .{
131629 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
132476 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
131630132477 .{ .type = .f80, .kind = .{ .reg = .st6 } },
131631132478 .{ .type = .f80, .kind = .{ .reg = .st7 } },
131632132479 .unused,
......@@ -131641,11 +132488,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
131641132488 .dst_temps = .{ .mem, .unused },
131642132489 .clobbers = .{ .eflags = true },
131643132490 .each = .{ .once = &.{
131644 .{ ._, ._, .mov, .tmp0p, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
132491 .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
131645132492 .{ ._, .f_, .ld, .memad(.src0t, .add_unaligned_size, -16), ._, ._, ._ },
131646132493 .{ .@"0:", .f_, .ld, .memi(.src0t, .tmp0), ._, ._, ._ },
131647132494 .{ ._, .f_p, .add, ._, ._, ._, ._ },
131648 .{ ._, ._, .sub, .tmp0p, .si(16), ._, ._ },
132495 .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
131649132496 .{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
131650132497 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
131651132498 } },
......@@ -133139,7 +133986,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
133139133986 .{ .src = .{ .to_mem, .none, .none } },
133140133987 },
133141133988 .extra_temps = .{
133142 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
133989 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
133143133990 .{ .type = .f64, .kind = .{ .reg = .st7 } },
133144133991 .unused,
133145133992 .unused,
......@@ -133154,10 +134001,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
133154134001 .dst_temps = .{ .mem, .unused },
133155134002 .clobbers = .{ .eflags = true },
133156134003 .each = .{ .once = &.{
133157 .{ ._, ._, .mov, .tmp0p, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
134004 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_unaligned_size), ._, ._ },
133158134005 .{ ._, .f_, .ld, .memad(.src0q, .add_unaligned_size, -8), ._, ._, ._ },
133159134006 .{ .@"0:", .f_, .mul, .memi(.src0q, .tmp0), ._, ._, ._ },
133160 .{ ._, ._, .sub, .tmp0p, .si(8), ._, ._ },
134007 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
133161134008 .{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
133162134009 .{ ._, .f_p, .st, .dst0q, ._, ._, ._ },
133163134010 } },
......@@ -133169,7 +134016,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
133169134016 .{ .src = .{ .to_mem, .none, .none } },
133170134017 },
133171134018 .extra_temps = .{
133172 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
134019 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
133173134020 .{ .type = .f80, .kind = .{ .reg = .st6 } },
133174134021 .{ .type = .f80, .kind = .{ .reg = .st7 } },
133175134022 .unused,
......@@ -133184,11 +134031,11 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
133184134031 .dst_temps = .{ .mem, .unused },
133185134032 .clobbers = .{ .eflags = true },
133186134033 .each = .{ .once = &.{
133187 .{ ._, ._, .mov, .tmp0p, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
134034 .{ ._, ._, .mov, .tmp0d, .sia(-32, .src0, .add_unaligned_size), ._, ._ },
133188134035 .{ ._, .f_, .ld, .memad(.src0t, .add_unaligned_size, -16), ._, ._, ._ },
133189134036 .{ .@"0:", .f_, .ld, .memi(.src0t, .tmp0), ._, ._, ._ },
133190134037 .{ ._, .f_p, .mul, ._, ._, ._, ._ },
133191 .{ ._, ._, .sub, .tmp0p, .si(16), ._, ._ },
134038 .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
133192134039 .{ ._, ._nb, .j, .@"0b", ._, ._, ._ },
133193134040 .{ ._, .f_p, .st, .dst0t, ._, ._, ._ },
133194134041 } },
test/behavior/x86_64/unary.zig+1
......@@ -5100,6 +5100,7 @@ inline fn reduceAdd(comptime Type: type, rhs: Type) @typeInfo(Type).vector.child
51005100test reduceAdd {
51015101 const test_reduce_add = unary(reduceAdd, .{});
51025102 try test_reduce_add.testIntVectors();
5103 try test_reduce_add.testFloatVectors();
51035104}
51045105
51055106inline fn reduceMul(comptime Type: type, rhs: Type) @typeInfo(Type).vector.child {