authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-12 22:52:16-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-17 02:08:41-04:00
log3529889cf30b5c21ff9d25a483ad187cd5559a41
tree15d4acc34a306cbc6dfa9762bad449fd3c4ba7f9
parent4adb7eca6ab2148026a9d2e00379cedfc2038a0d

x86_64: rewrite scalar `-|`


3 files changed, 1729 insertions(+), 4 deletions(-)

src/arch/x86_64/CodeGen.zig+1720-3
......@@ -2408,7 +2408,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24082408}
24092409
24102410fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2411 @setEvalBranchQuota(16_900);
2411 @setEvalBranchQuota(17_100);
24122412 const pt = cg.pt;
24132413 const zcu = pt.zcu;
24142414 const ip = &zcu.intern_pool;
......@@ -2444,7 +2444,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24442444 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);
24452445 switch (air_tags[@intFromEnum(inst)]) {
24462446 // zig fmt: off
2447 .sub_sat => try cg.airSubSat(inst),
24482447 .mul_sat => try cg.airMulSat(inst),
24492448 .shl_sat => try cg.airShlSat(inst),
24502449
......@@ -14815,6 +14814,1720 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1481514814 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
1481614815 },
1481714816 .sub_safe => unreachable,
14817 .sub_sat => |air_tag| if (use_old) try cg.airSubSat(inst) else fallback: {
14818 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
14819 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airSubSat(inst);
14820 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
14821 var res: [1]Temp = undefined;
14822 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
14823 .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
14824 .patterns = &.{
14825 .{ .src = .{ .to_mut_gpr, .{ .imm = 0 }, .none } },
14826 },
14827 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14828 .each = .{ .once = &.{} },
14829 }, .{
14830 .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
14831 .patterns = &.{
14832 .{ .src = .{ .any, .imm8, .none } },
14833 },
14834 .dst_temps = .{ .{ .imm = 0 }, .unused },
14835 .each = .{ .once = &.{} },
14836 }, .{
14837 .required_features = .{ .bmi, null, null, null },
14838 .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
14839 .patterns = &.{
14840 .{ .src = .{ .to_gpr, .to_gpr, .none } },
14841 },
14842 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .general_purpose } }, .unused },
14843 .clobbers = .{ .eflags = true },
14844 .each = .{ .once = &.{
14845 .{ ._, ._, .andn, .dst0d, .src1d, .src0d, ._ },
14846 } },
14847 }, .{
14848 .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any },
14849 .patterns = &.{
14850 .{ .src = .{ .mem, .to_mut_gpr, .none } },
14851 .{ .src = .{ .to_gpr, .to_mut_gpr, .none } },
14852 },
14853 .dst_temps = .{ .{ .ref = .src1 }, .unused },
14854 .clobbers = .{ .eflags = true },
14855 .each = .{ .once = &.{
14856 .{ ._, ._, .not, .src1b, ._, ._, ._ },
14857 .{ ._, ._, .@"and", .dst0b, .src0b, ._, ._ },
14858 } },
14859 }, .{
14860 .required_features = .{ .cmov, null, null, null },
14861 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any },
14862 .patterns = &.{
14863 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
14864 .{ .src = .{ .to_mut_gpr, .mem, .none } },
14865 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
14866 },
14867 .extra_temps = .{
14868 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
14869 .unused,
14870 .unused,
14871 .unused,
14872 .unused,
14873 .unused,
14874 .unused,
14875 .unused,
14876 .unused,
14877 .unused,
14878 .unused,
14879 },
14880 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14881 .clobbers = .{ .eflags = true },
14882 .each = .{ .once = &.{
14883 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
14884 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
14885 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
14886 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
14887 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
14888 } },
14889 }, .{
14890 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any },
14891 .patterns = &.{
14892 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
14893 .{ .src = .{ .to_mut_gpr, .mem, .none } },
14894 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
14895 },
14896 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14897 .clobbers = .{ .eflags = true },
14898 .each = .{ .once = &.{
14899 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
14900 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
14901 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
14902 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smin), ._, ._ },
14903 } },
14904 }, .{
14905 .required_features = .{ .cmov, null, null, null },
14906 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any },
14907 .patterns = &.{
14908 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
14909 .{ .src = .{ .to_mut_gpr, .mem, .none } },
14910 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
14911 },
14912 .extra_temps = .{
14913 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
14914 .unused,
14915 .unused,
14916 .unused,
14917 .unused,
14918 .unused,
14919 .unused,
14920 .unused,
14921 .unused,
14922 .unused,
14923 .unused,
14924 },
14925 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14926 .clobbers = .{ .eflags = true },
14927 .each = .{ .once = &.{
14928 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
14929 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
14930 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
14931 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
14932 .{ ._, ._, .@"test", .dst0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
14933 .{ ._, ._po, .cmov, .dst0d, .tmp0d, ._, ._ },
14934 } },
14935 }, .{
14936 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any },
14937 .patterns = &.{
14938 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
14939 .{ .src = .{ .to_mut_gpr, .mem, .none } },
14940 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
14941 },
14942 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14943 .clobbers = .{ .eflags = true },
14944 .each = .{ .once = &.{
14945 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
14946 .{ ._, ._, .@"test", .dst0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
14947 .{ ._, ._pe, .j, .@"0f", ._, ._, ._ },
14948 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
14949 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smax), ._, ._ },
14950 } },
14951 }, .{
14952 .required_features = .{ .cmov, null, null, null },
14953 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
14954 .patterns = &.{
14955 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
14956 .{ .src = .{ .to_mut_gpr, .mem, .none } },
14957 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
14958 },
14959 .extra_temps = .{
14960 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
14961 .unused,
14962 .unused,
14963 .unused,
14964 .unused,
14965 .unused,
14966 .unused,
14967 .unused,
14968 .unused,
14969 .unused,
14970 .unused,
14971 },
14972 .dst_temps = .{ .{ .ref = .src0 }, .unused },
14973 .clobbers = .{ .eflags = true },
14974 .each = .{ .once = &.{
14975 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
14976 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
14977 .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
14978 } },
14979 }, .{
14980 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
14981 .patterns = &.{
14982 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
14983 .{ .src = .{ .to_mut_gpr, .mem, .none } },
14984 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
14985 },
14986 .extra_temps = .{
14987 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
14988 .unused,
14989 .unused,
14990 .unused,
14991 .unused,
14992 .unused,
14993 .unused,
14994 .unused,
14995 .unused,
14996 .unused,
14997 .unused,
14998 },
14999 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15000 .clobbers = .{ .eflags = true },
15001 .each = .{ .once = &.{
15002 .{ ._, ._, .sub, .dst0b, .src1b, ._, ._ },
15003 .{ ._, ._, .cmc, ._, ._, ._, ._ },
15004 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
15005 .{ ._, ._, .@"and", .dst0b, .tmp0b, ._, ._ },
15006 } },
15007 }, .{
15008 .required_features = .{ .cmov, .fast_imm16, null, null },
15009 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
15010 .patterns = &.{
15011 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15012 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15013 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15014 },
15015 .extra_temps = .{
15016 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15017 .unused,
15018 .unused,
15019 .unused,
15020 .unused,
15021 .unused,
15022 .unused,
15023 .unused,
15024 .unused,
15025 .unused,
15026 .unused,
15027 },
15028 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15029 .clobbers = .{ .eflags = true },
15030 .each = .{ .once = &.{
15031 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15032 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15033 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15034 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15035 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15036 } },
15037 }, .{
15038 .required_features = .{ .cmov, null, null, null },
15039 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
15040 .patterns = &.{
15041 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15042 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15043 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15044 },
15045 .extra_temps = .{
15046 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15047 .unused,
15048 .unused,
15049 .unused,
15050 .unused,
15051 .unused,
15052 .unused,
15053 .unused,
15054 .unused,
15055 .unused,
15056 .unused,
15057 },
15058 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15059 .clobbers = .{ .eflags = true },
15060 .each = .{ .once = &.{
15061 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15062 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15063 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15064 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15065 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15066 } },
15067 }, .{
15068 .required_features = .{ .fast_imm16, null, null, null },
15069 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
15070 .patterns = &.{
15071 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15072 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15073 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15074 },
15075 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15076 .clobbers = .{ .eflags = true },
15077 .each = .{ .once = &.{
15078 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15079 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15080 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15081 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smin), ._, ._ },
15082 } },
15083 }, .{
15084 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
15085 .patterns = &.{
15086 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15087 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15088 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15089 },
15090 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15091 .clobbers = .{ .eflags = true },
15092 .each = .{ .once = &.{
15093 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15094 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15095 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15096 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
15097 } },
15098 }, .{
15099 .required_features = .{ .cmov, .fast_imm16, null, null },
15100 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15101 .patterns = &.{
15102 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15103 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15104 },
15105 .extra_temps = .{
15106 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15107 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15108 .unused,
15109 .unused,
15110 .unused,
15111 .unused,
15112 .unused,
15113 .unused,
15114 .unused,
15115 .unused,
15116 .unused,
15117 },
15118 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15119 .clobbers = .{ .eflags = true },
15120 .each = .{ .once = &.{
15121 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15122 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15123 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15124 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15125 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15126 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
15127 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15128 } },
15129 }, .{
15130 .required_features = .{ .cmov, .fast_imm16, null, null },
15131 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15132 .patterns = &.{
15133 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15134 },
15135 .extra_temps = .{
15136 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15137 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15138 .unused,
15139 .unused,
15140 .unused,
15141 .unused,
15142 .unused,
15143 .unused,
15144 .unused,
15145 .unused,
15146 .unused,
15147 },
15148 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15149 .clobbers = .{ .eflags = true },
15150 .each = .{ .once = &.{
15151 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15152 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15153 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15154 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15155 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15156 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
15157 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15158 } },
15159 }, .{
15160 .required_features = .{ .cmov, null, null, null },
15161 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15162 .patterns = &.{
15163 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15164 },
15165 .extra_temps = .{
15166 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15167 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15168 .unused,
15169 .unused,
15170 .unused,
15171 .unused,
15172 .unused,
15173 .unused,
15174 .unused,
15175 .unused,
15176 .unused,
15177 },
15178 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15179 .clobbers = .{ .eflags = true },
15180 .each = .{ .once = &.{
15181 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15182 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15183 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15184 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15185 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15186 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
15187 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15188 } },
15189 }, .{
15190 .required_features = .{ .cmov, null, null, null },
15191 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15192 .patterns = &.{
15193 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15194 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15195 },
15196 .extra_temps = .{
15197 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15198 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15199 .unused,
15200 .unused,
15201 .unused,
15202 .unused,
15203 .unused,
15204 .unused,
15205 .unused,
15206 .unused,
15207 .unused,
15208 },
15209 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15210 .clobbers = .{ .eflags = true },
15211 .each = .{ .once = &.{
15212 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15213 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15214 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15215 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15216 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15217 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
15218 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15219 } },
15220 }, .{
15221 .required_features = .{ .fast_imm16, null, null, null },
15222 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15223 .patterns = &.{
15224 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15225 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15226 },
15227 .extra_temps = .{
15228 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15229 .unused,
15230 .unused,
15231 .unused,
15232 .unused,
15233 .unused,
15234 .unused,
15235 .unused,
15236 .unused,
15237 .unused,
15238 .unused,
15239 },
15240 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15241 .clobbers = .{ .eflags = true },
15242 .each = .{ .once = &.{
15243 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15244 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15245 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
15246 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15247 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15248 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
15249 } },
15250 }, .{
15251 .required_features = .{ .fast_imm16, null, null, null },
15252 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15253 .patterns = &.{
15254 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15255 },
15256 .extra_temps = .{
15257 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15258 .unused,
15259 .unused,
15260 .unused,
15261 .unused,
15262 .unused,
15263 .unused,
15264 .unused,
15265 .unused,
15266 .unused,
15267 .unused,
15268 },
15269 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15270 .clobbers = .{ .eflags = true },
15271 .each = .{ .once = &.{
15272 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15273 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15274 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
15275 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15276 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15277 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
15278 } },
15279 }, .{
15280 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15281 .patterns = &.{
15282 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15283 },
15284 .extra_temps = .{
15285 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15286 .unused,
15287 .unused,
15288 .unused,
15289 .unused,
15290 .unused,
15291 .unused,
15292 .unused,
15293 .unused,
15294 .unused,
15295 .unused,
15296 },
15297 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15298 .clobbers = .{ .eflags = true },
15299 .each = .{ .once = &.{
15300 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15301 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15302 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
15303 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15304 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15305 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
15306 } },
15307 }, .{
15308 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
15309 .patterns = &.{
15310 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15311 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15312 },
15313 .extra_temps = .{
15314 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15315 .unused,
15316 .unused,
15317 .unused,
15318 .unused,
15319 .unused,
15320 .unused,
15321 .unused,
15322 .unused,
15323 .unused,
15324 .unused,
15325 },
15326 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15327 .clobbers = .{ .eflags = true },
15328 .each = .{ .once = &.{
15329 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15330 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15331 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
15332 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15333 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15334 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
15335 } },
15336 }, .{
15337 .required_features = .{ .bmi2, .cmov, .fast_imm16, null },
15338 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15339 .patterns = &.{
15340 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15341 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15342 },
15343 .extra_temps = .{
15344 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15345 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15346 .unused,
15347 .unused,
15348 .unused,
15349 .unused,
15350 .unused,
15351 .unused,
15352 .unused,
15353 .unused,
15354 .unused,
15355 },
15356 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15357 .clobbers = .{ .eflags = true },
15358 .each = .{ .once = &.{
15359 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15360 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15361 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15362 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15363 .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
15364 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15365 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15366 } },
15367 }, .{
15368 .required_features = .{ .bmi2, .cmov, .fast_imm16, null },
15369 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15370 .patterns = &.{
15371 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15372 },
15373 .extra_temps = .{
15374 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15375 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15376 .unused,
15377 .unused,
15378 .unused,
15379 .unused,
15380 .unused,
15381 .unused,
15382 .unused,
15383 .unused,
15384 .unused,
15385 },
15386 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15387 .clobbers = .{ .eflags = true },
15388 .each = .{ .once = &.{
15389 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15390 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15391 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15392 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15393 .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
15394 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15395 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15396 } },
15397 }, .{
15398 .required_features = .{ .bmi2, .cmov, null, null },
15399 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15400 .patterns = &.{
15401 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15402 },
15403 .extra_temps = .{
15404 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15405 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15406 .unused,
15407 .unused,
15408 .unused,
15409 .unused,
15410 .unused,
15411 .unused,
15412 .unused,
15413 .unused,
15414 .unused,
15415 },
15416 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15417 .clobbers = .{ .eflags = true },
15418 .each = .{ .once = &.{
15419 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15420 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15421 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15422 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15423 .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
15424 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15425 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15426 } },
15427 }, .{
15428 .required_features = .{ .bmi2, .cmov, null, null },
15429 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15430 .patterns = &.{
15431 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15432 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15433 },
15434 .extra_temps = .{
15435 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15436 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15437 .unused,
15438 .unused,
15439 .unused,
15440 .unused,
15441 .unused,
15442 .unused,
15443 .unused,
15444 .unused,
15445 .unused,
15446 },
15447 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15448 .clobbers = .{ .eflags = true },
15449 .each = .{ .once = &.{
15450 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15451 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15452 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15453 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15454 .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
15455 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15456 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15457 } },
15458 }, .{
15459 .required_features = .{ .cmov, .fast_imm16, null, null },
15460 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15461 .patterns = &.{
15462 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15463 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15464 },
15465 .extra_temps = .{
15466 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15467 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15468 .unused,
15469 .unused,
15470 .unused,
15471 .unused,
15472 .unused,
15473 .unused,
15474 .unused,
15475 .unused,
15476 .unused,
15477 },
15478 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15479 .clobbers = .{ .eflags = true },
15480 .each = .{ .once = &.{
15481 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15482 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15483 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15484 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15485 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15486 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15487 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15488 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15489 } },
15490 }, .{
15491 .required_features = .{ .cmov, .fast_imm16, null, null },
15492 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15493 .patterns = &.{
15494 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15495 },
15496 .extra_temps = .{
15497 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15498 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15499 .unused,
15500 .unused,
15501 .unused,
15502 .unused,
15503 .unused,
15504 .unused,
15505 .unused,
15506 .unused,
15507 .unused,
15508 },
15509 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15510 .clobbers = .{ .eflags = true },
15511 .each = .{ .once = &.{
15512 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15513 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15514 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15515 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
15516 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15517 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15518 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15519 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15520 } },
15521 }, .{
15522 .required_features = .{ .cmov, null, null, null },
15523 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15524 .patterns = &.{
15525 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15526 },
15527 .extra_temps = .{
15528 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15529 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15530 .unused,
15531 .unused,
15532 .unused,
15533 .unused,
15534 .unused,
15535 .unused,
15536 .unused,
15537 .unused,
15538 .unused,
15539 },
15540 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15541 .clobbers = .{ .eflags = true },
15542 .each = .{ .once = &.{
15543 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15544 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15545 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15546 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15547 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15548 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15549 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15550 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15551 } },
15552 }, .{
15553 .required_features = .{ .cmov, null, null, null },
15554 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15555 .patterns = &.{
15556 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15557 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15558 },
15559 .extra_temps = .{
15560 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15561 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15562 .unused,
15563 .unused,
15564 .unused,
15565 .unused,
15566 .unused,
15567 .unused,
15568 .unused,
15569 .unused,
15570 .unused,
15571 },
15572 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15573 .clobbers = .{ .eflags = true },
15574 .each = .{ .once = &.{
15575 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15576 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
15577 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15578 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15579 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15580 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15581 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15582 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15583 } },
15584 }, .{
15585 .required_features = .{ .fast_imm16, null, null, null },
15586 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15587 .patterns = &.{
15588 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15589 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15590 },
15591 .extra_temps = .{
15592 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15593 .unused,
15594 .unused,
15595 .unused,
15596 .unused,
15597 .unused,
15598 .unused,
15599 .unused,
15600 .unused,
15601 .unused,
15602 .unused,
15603 },
15604 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15605 .clobbers = .{ .eflags = true },
15606 .each = .{ .once = &.{
15607 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15608 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15609 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15610 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
15611 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15612 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15613 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
15614 } },
15615 }, .{
15616 .required_features = .{ .fast_imm16, null, null, null },
15617 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15618 .patterns = &.{
15619 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15620 },
15621 .extra_temps = .{
15622 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15623 .unused,
15624 .unused,
15625 .unused,
15626 .unused,
15627 .unused,
15628 .unused,
15629 .unused,
15630 .unused,
15631 .unused,
15632 .unused,
15633 },
15634 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15635 .clobbers = .{ .eflags = true },
15636 .each = .{ .once = &.{
15637 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15638 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15639 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15640 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
15641 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15642 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15643 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
15644 } },
15645 }, .{
15646 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15647 .patterns = &.{
15648 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15649 },
15650 .extra_temps = .{
15651 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15652 .unused,
15653 .unused,
15654 .unused,
15655 .unused,
15656 .unused,
15657 .unused,
15658 .unused,
15659 .unused,
15660 .unused,
15661 .unused,
15662 },
15663 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15664 .clobbers = .{ .eflags = true },
15665 .each = .{ .once = &.{
15666 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15667 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15668 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15669 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
15670 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15671 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15672 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
15673 } },
15674 }, .{
15675 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
15676 .patterns = &.{
15677 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15678 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15679 },
15680 .extra_temps = .{
15681 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
15682 .unused,
15683 .unused,
15684 .unused,
15685 .unused,
15686 .unused,
15687 .unused,
15688 .unused,
15689 .unused,
15690 .unused,
15691 .unused,
15692 },
15693 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15694 .clobbers = .{ .eflags = true },
15695 .each = .{ .once = &.{
15696 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15697 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15698 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15699 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
15700 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15701 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
15702 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
15703 } },
15704 }, .{
15705 .required_features = .{ .cmov, null, null, null },
15706 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
15707 .patterns = &.{
15708 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15709 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15710 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15711 },
15712 .extra_temps = .{
15713 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
15714 .unused,
15715 .unused,
15716 .unused,
15717 .unused,
15718 .unused,
15719 .unused,
15720 .unused,
15721 .unused,
15722 .unused,
15723 .unused,
15724 },
15725 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15726 .clobbers = .{ .eflags = true },
15727 .each = .{ .once = &.{
15728 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
15729 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15730 .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
15731 } },
15732 }, .{
15733 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
15734 .patterns = &.{
15735 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
15736 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15737 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15738 },
15739 .extra_temps = .{
15740 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
15741 .unused,
15742 .unused,
15743 .unused,
15744 .unused,
15745 .unused,
15746 .unused,
15747 .unused,
15748 .unused,
15749 .unused,
15750 .unused,
15751 },
15752 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15753 .clobbers = .{ .eflags = true },
15754 .each = .{ .once = &.{
15755 .{ ._, ._, .sub, .dst0w, .src1w, ._, ._ },
15756 .{ ._, ._, .cmc, ._, ._, ._, ._ },
15757 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
15758 .{ ._, ._, .@"and", .dst0d, .tmp0d, ._, ._ },
15759 } },
15760 }, .{
15761 .required_features = .{ .cmov, null, null, null },
15762 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
15763 .patterns = &.{
15764 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15765 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15766 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15767 },
15768 .extra_temps = .{
15769 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15770 .unused,
15771 .unused,
15772 .unused,
15773 .unused,
15774 .unused,
15775 .unused,
15776 .unused,
15777 .unused,
15778 .unused,
15779 .unused,
15780 },
15781 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15782 .clobbers = .{ .eflags = true },
15783 .each = .{ .once = &.{
15784 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15785 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15786 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15787 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15788 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15789 } },
15790 }, .{
15791 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
15792 .patterns = &.{
15793 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15794 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15795 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15796 },
15797 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15798 .clobbers = .{ .eflags = true },
15799 .each = .{ .once = &.{
15800 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15801 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15802 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
15803 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
15804 } },
15805 }, .{
15806 .required_features = .{ .cmov, null, null, null },
15807 .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any },
15808 .patterns = &.{
15809 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15810 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15811 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15812 },
15813 .extra_temps = .{
15814 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15815 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15816 .unused,
15817 .unused,
15818 .unused,
15819 .unused,
15820 .unused,
15821 .unused,
15822 .unused,
15823 .unused,
15824 .unused,
15825 },
15826 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15827 .clobbers = .{ .eflags = true },
15828 .each = .{ .once = &.{
15829 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15830 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15831 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15832 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15833 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15834 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15835 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15836 } },
15837 }, .{
15838 .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any },
15839 .patterns = &.{
15840 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15841 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15842 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15843 },
15844 .extra_temps = .{
15845 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15846 .unused,
15847 .unused,
15848 .unused,
15849 .unused,
15850 .unused,
15851 .unused,
15852 .unused,
15853 .unused,
15854 .unused,
15855 .unused,
15856 },
15857 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15858 .clobbers = .{ .eflags = true },
15859 .each = .{ .once = &.{
15860 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15861 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15862 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
15863 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15864 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
15865 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
15866 } },
15867 }, .{
15868 .required_features = .{ .bmi2, .cmov, null, null },
15869 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
15870 .patterns = &.{
15871 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15872 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15873 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15874 },
15875 .extra_temps = .{
15876 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15877 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15878 .unused,
15879 .unused,
15880 .unused,
15881 .unused,
15882 .unused,
15883 .unused,
15884 .unused,
15885 .unused,
15886 .unused,
15887 },
15888 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15889 .clobbers = .{ .eflags = true },
15890 .each = .{ .once = &.{
15891 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15892 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15893 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15894 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15895 .{ ._, ._rx, .ro, .tmp1d, .dst0d, .uia(1, .src0, .add_bit_size), ._ },
15896 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15897 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15898 } },
15899 }, .{
15900 .required_features = .{ .cmov, null, null, null },
15901 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
15902 .patterns = &.{
15903 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15904 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15905 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15906 },
15907 .extra_temps = .{
15908 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15909 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15910 .unused,
15911 .unused,
15912 .unused,
15913 .unused,
15914 .unused,
15915 .unused,
15916 .unused,
15917 .unused,
15918 .unused,
15919 },
15920 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15921 .clobbers = .{ .eflags = true },
15922 .each = .{ .once = &.{
15923 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15924 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
15925 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15926 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
15927 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
15928 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15929 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
15930 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
15931 } },
15932 }, .{
15933 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
15934 .patterns = &.{
15935 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15936 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15937 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15938 },
15939 .extra_temps = .{
15940 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
15941 .unused,
15942 .unused,
15943 .unused,
15944 .unused,
15945 .unused,
15946 .unused,
15947 .unused,
15948 .unused,
15949 .unused,
15950 .unused,
15951 },
15952 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15953 .clobbers = .{ .eflags = true },
15954 .each = .{ .once = &.{
15955 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15956 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
15957 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
15958 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
15959 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
15960 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
15961 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
15962 } },
15963 }, .{
15964 .required_features = .{ .cmov, null, null, null },
15965 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
15966 .patterns = &.{
15967 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15968 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15969 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15970 },
15971 .extra_temps = .{
15972 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
15973 .unused,
15974 .unused,
15975 .unused,
15976 .unused,
15977 .unused,
15978 .unused,
15979 .unused,
15980 .unused,
15981 .unused,
15982 .unused,
15983 },
15984 .dst_temps = .{ .{ .ref = .src0 }, .unused },
15985 .clobbers = .{ .eflags = true },
15986 .each = .{ .once = &.{
15987 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
15988 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
15989 .{ ._, ._c, .cmov, .dst0d, .tmp0d, ._, ._ },
15990 } },
15991 }, .{
15992 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
15993 .patterns = &.{
15994 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
15995 .{ .src = .{ .to_mut_gpr, .mem, .none } },
15996 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
15997 },
15998 .extra_temps = .{
15999 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
16000 .unused,
16001 .unused,
16002 .unused,
16003 .unused,
16004 .unused,
16005 .unused,
16006 .unused,
16007 .unused,
16008 .unused,
16009 .unused,
16010 },
16011 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16012 .clobbers = .{ .eflags = true },
16013 .each = .{ .once = &.{
16014 .{ ._, ._, .sub, .dst0d, .src1d, ._, ._ },
16015 .{ ._, ._, .cmc, ._, ._, ._, ._ },
16016 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
16017 .{ ._, ._, .@"and", .dst0d, .tmp0d, ._, ._ },
16018 } },
16019 }, .{
16020 .required_features = .{ .@"64bit", .cmov, null, null },
16021 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
16022 .patterns = &.{
16023 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16024 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16025 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16026 },
16027 .extra_temps = .{
16028 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16029 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16030 .unused,
16031 .unused,
16032 .unused,
16033 .unused,
16034 .unused,
16035 .unused,
16036 .unused,
16037 .unused,
16038 .unused,
16039 },
16040 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16041 .clobbers = .{ .eflags = true },
16042 .each = .{ .once = &.{
16043 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16044 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16045 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
16046 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
16047 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16048 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
16049 } },
16050 }, .{
16051 .required_features = .{ .@"64bit", null, null, null },
16052 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
16053 .patterns = &.{
16054 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16055 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16056 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16057 },
16058 .extra_temps = .{
16059 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16060 .unused,
16061 .unused,
16062 .unused,
16063 .unused,
16064 .unused,
16065 .unused,
16066 .unused,
16067 .unused,
16068 .unused,
16069 .unused,
16070 },
16071 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16072 .clobbers = .{ .eflags = true },
16073 .each = .{ .once = &.{
16074 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16075 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
16076 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
16077 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smin), ._, ._ },
16078 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
16079 } },
16080 }, .{
16081 .required_features = .{ .@"64bit", .cmov, null, null },
16082 .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any },
16083 .patterns = &.{
16084 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16085 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16086 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16087 },
16088 .extra_temps = .{
16089 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16090 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16091 .unused,
16092 .unused,
16093 .unused,
16094 .unused,
16095 .unused,
16096 .unused,
16097 .unused,
16098 .unused,
16099 .unused,
16100 },
16101 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16102 .clobbers = .{ .eflags = true },
16103 .each = .{ .once = &.{
16104 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16105 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16106 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16107 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
16108 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
16109 .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ },
16110 .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
16111 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
16112 } },
16113 }, .{
16114 .required_features = .{ .@"64bit", null, null, null },
16115 .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any },
16116 .patterns = &.{
16117 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16118 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16119 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16120 },
16121 .extra_temps = .{
16122 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16123 .unused,
16124 .unused,
16125 .unused,
16126 .unused,
16127 .unused,
16128 .unused,
16129 .unused,
16130 .unused,
16131 .unused,
16132 .unused,
16133 },
16134 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16135 .clobbers = .{ .eflags = true },
16136 .each = .{ .once = &.{
16137 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16138 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16139 .{ ._, ._, .add, .tmp0q, .tmp0q, ._, ._ },
16140 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
16141 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
16142 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
16143 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
16144 } },
16145 }, .{
16146 .required_features = .{ .@"64bit", .bmi2, .cmov, null },
16147 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
16148 .patterns = &.{
16149 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16150 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16151 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16152 },
16153 .extra_temps = .{
16154 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16155 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16156 .unused,
16157 .unused,
16158 .unused,
16159 .unused,
16160 .unused,
16161 .unused,
16162 .unused,
16163 .unused,
16164 .unused,
16165 },
16166 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16167 .clobbers = .{ .eflags = true },
16168 .each = .{ .once = &.{
16169 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16170 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16171 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16172 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
16173 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
16174 .{ ._, ._rx, .ro, .tmp1q, .dst0q, .sia(-31, .src0, .add_bit_size), ._ },
16175 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
16176 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
16177 } },
16178 }, .{
16179 .required_features = .{ .@"64bit", .cmov, null, null },
16180 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
16181 .patterns = &.{
16182 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16183 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16184 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16185 },
16186 .extra_temps = .{
16187 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16188 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16189 .unused,
16190 .unused,
16191 .unused,
16192 .unused,
16193 .unused,
16194 .unused,
16195 .unused,
16196 .unused,
16197 .unused,
16198 },
16199 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16200 .clobbers = .{ .eflags = true },
16201 .each = .{ .once = &.{
16202 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16203 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
16204 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16205 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
16206 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
16207 .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ },
16208 .{ ._, ._r, .sh, .tmp1q, .sia(-31, .src0, .add_bit_size), ._, ._ },
16209 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
16210 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
16211 } },
16212 }, .{
16213 .required_features = .{ .@"64bit", null, null, null },
16214 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
16215 .patterns = &.{
16216 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16217 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16218 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16219 },
16220 .extra_temps = .{
16221 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
16222 .unused,
16223 .unused,
16224 .unused,
16225 .unused,
16226 .unused,
16227 .unused,
16228 .unused,
16229 .unused,
16230 .unused,
16231 .unused,
16232 },
16233 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16234 .clobbers = .{ .eflags = true },
16235 .each = .{ .once = &.{
16236 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16237 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
16238 .{ ._, ._r, .sh, .tmp0q, .sia(-31, .src0, .add_bit_size), ._, ._ },
16239 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
16240 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
16241 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
16242 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
16243 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
16244 } },
16245 }, .{
16246 .required_features = .{ .@"64bit", .cmov, null, null },
16247 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
16248 .patterns = &.{
16249 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16250 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16251 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16252 },
16253 .extra_temps = .{
16254 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
16255 .unused,
16256 .unused,
16257 .unused,
16258 .unused,
16259 .unused,
16260 .unused,
16261 .unused,
16262 .unused,
16263 .unused,
16264 .unused,
16265 },
16266 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16267 .clobbers = .{ .eflags = true },
16268 .each = .{ .once = &.{
16269 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
16270 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16271 .{ ._, ._c, .cmov, .dst0q, .tmp0q, ._, ._ },
16272 } },
16273 }, .{
16274 .required_features = .{ .@"64bit", null, null, null },
16275 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
16276 .patterns = &.{
16277 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
16278 .{ .src = .{ .to_mut_gpr, .mem, .none } },
16279 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
16280 },
16281 .extra_temps = .{
16282 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
16283 .unused,
16284 .unused,
16285 .unused,
16286 .unused,
16287 .unused,
16288 .unused,
16289 .unused,
16290 .unused,
16291 .unused,
16292 .unused,
16293 },
16294 .dst_temps = .{ .{ .ref = .src0 }, .unused },
16295 .clobbers = .{ .eflags = true },
16296 .each = .{ .once = &.{
16297 .{ ._, ._, .sub, .dst0q, .src1q, ._, ._ },
16298 .{ ._, ._, .cmc, ._, ._, ._, ._ },
16299 .{ ._, ._, .sbb, .tmp0q, .tmp0q, ._, ._ },
16300 .{ ._, ._, .@"and", .dst0q, .tmp0q, ._, ._ },
16301 } },
16302 }, .{
16303 .required_features = .{ .@"64bit", null, null, null },
16304 .src_constraints = .{
16305 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
16306 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
16307 .any,
16308 },
16309 .patterns = &.{
16310 .{ .src = .{ .to_mem, .to_mem, .none } },
16311 },
16312 .extra_temps = .{
16313 .{ .type = .isize, .kind = .{ .reg = .rdi } },
16314 .{ .type = .i64, .kind = .{ .reg = .rax } },
16315 .{ .type = .u64, .kind = .{ .reg = .rcx } },
16316 .unused,
16317 .unused,
16318 .unused,
16319 .unused,
16320 .unused,
16321 .unused,
16322 .unused,
16323 .unused,
16324 },
16325 .dst_temps = .{ .mem, .unused },
16326 .clobbers = .{ .eflags = true },
16327 .each = .{ .once = &.{
16328 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
16329 .{ ._, ._c, .cl, ._, ._, ._, ._ },
16330 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
16331 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
16332 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -8), .tmp1q, ._, ._ },
16333 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
16334 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
16335 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
16336 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
16337 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
16338 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
16339 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
16340 .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
16341 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
16342 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
16343 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
16344 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
16345 } },
16346 }, .{
16347 .required_features = .{ .@"64bit", null, null, null },
16348 .src_constraints = .{
16349 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
16350 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
16351 .any,
16352 },
16353 .patterns = &.{
16354 .{ .src = .{ .to_mem, .to_mem, .none } },
16355 },
16356 .extra_temps = .{
16357 .{ .type = .isize, .kind = .{ .reg = .rdi } },
16358 .{ .type = .i64, .kind = .{ .reg = .rax } },
16359 .{ .type = .u64, .kind = .{ .reg = .rcx } },
16360 .unused,
16361 .unused,
16362 .unused,
16363 .unused,
16364 .unused,
16365 .unused,
16366 .unused,
16367 .unused,
16368 },
16369 .dst_temps = .{ .mem, .unused },
16370 .clobbers = .{ .eflags = true },
16371 .each = .{ .once = &.{
16372 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
16373 .{ ._, ._c, .cl, ._, ._, ._, ._ },
16374 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
16375 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
16376 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -16), .tmp1q, ._, ._ },
16377 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
16378 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
16379 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
16380 .{ ._, ._, .sbb, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
16381 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
16382 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
16383 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
16384 .{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
16385 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
16386 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
16387 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
16388 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
16389 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
16390 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
16391 } },
16392 }, .{
16393 .required_features = .{ .@"64bit", null, null, null },
16394 .src_constraints = .{
16395 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
16396 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
16397 .any,
16398 },
16399 .patterns = &.{
16400 .{ .src = .{ .to_mem, .to_mem, .none } },
16401 },
16402 .extra_temps = .{
16403 .{ .type = .isize, .kind = .{ .reg = .rdi } },
16404 .{ .type = .i64, .kind = .{ .reg = .rax } },
16405 .{ .type = .u64, .kind = .{ .reg = .rcx } },
16406 .unused,
16407 .unused,
16408 .unused,
16409 .unused,
16410 .unused,
16411 .unused,
16412 .unused,
16413 .unused,
16414 },
16415 .dst_temps = .{ .mem, .unused },
16416 .clobbers = .{ .eflags = true },
16417 .each = .{ .once = &.{
16418 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
16419 .{ ._, ._c, .cl, ._, ._, ._, ._ },
16420 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
16421 .{ ._, ._, .sbb, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
16422 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -8), .tmp1q, ._, ._ },
16423 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
16424 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
16425 .{ ._, ._l, .sa, .tmp1q, .uia(63, .src0, .sub_bit_size_rem_64), ._, ._ },
16426 .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
16427 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
16428 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
16429 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
16430 .{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
16431 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
16432 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
16433 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
16434 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
16435 .{ .@"0:", ._r, .sa, .tmp1q, .ui(63), ._, ._ },
16436 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
16437 } },
16438 }, .{
16439 .required_features = .{ .@"64bit", null, null, null },
16440 .src_constraints = .{
16441 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
16442 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
16443 .any,
16444 },
16445 .patterns = &.{
16446 .{ .src = .{ .to_mem, .to_mem, .none } },
16447 },
16448 .extra_temps = .{
16449 .{ .type = .isize, .kind = .{ .reg = .rdi } },
16450 .{ .type = .i64, .kind = .{ .reg = .rax } },
16451 .{ .type = .u64, .kind = .{ .reg = .rcx } },
16452 .unused,
16453 .unused,
16454 .unused,
16455 .unused,
16456 .unused,
16457 .unused,
16458 .unused,
16459 .unused,
16460 },
16461 .dst_temps = .{ .mem, .unused },
16462 .clobbers = .{ .eflags = true },
16463 .each = .{ .once = &.{
16464 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
16465 .{ ._, ._c, .cl, ._, ._, ._, ._ },
16466 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
16467 .{ ._, ._, .sbb, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
16468 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp1q, ._, ._ },
16469 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
16470 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
16471 .{ ._, ._l, .sa, .tmp1q, .uia(63, .src0, .sub_bit_size_rem_64), ._, ._ },
16472 .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
16473 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
16474 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
16475 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
16476 .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
16477 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
16478 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
16479 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
16480 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
16481 } },
16482 }, .{
16483 .required_features = .{ .@"64bit", null, null, null },
16484 .src_constraints = .{
16485 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
16486 .{ .remainder_unsigned_int = .{ .of = .qword, .is = .qword } },
16487 .any,
16488 },
16489 .patterns = &.{
16490 .{ .src = .{ .to_mem, .to_mem, .none } },
16491 },
16492 .extra_temps = .{
16493 .{ .type = .isize, .kind = .{ .reg = .rdi } },
16494 .{ .type = .u64, .kind = .{ .reg = .rax } },
16495 .{ .type = .u64, .kind = .{ .reg = .rcx } },
16496 .unused,
16497 .unused,
16498 .unused,
16499 .unused,
16500 .unused,
16501 .unused,
16502 .unused,
16503 .unused,
16504 },
16505 .dst_temps = .{ .mem, .unused },
16506 .clobbers = .{ .eflags = true },
16507 .each = .{ .once = &.{
16508 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
16509 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
16510 .{ .@"0:", ._, .mov, .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
16511 .{ ._, ._, .sbb, .tmp2q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
16512 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp2q, ._, ._ },
16513 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
16514 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
16515 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
16516 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
16517 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
16518 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
16519 } },
16520 } }) catch |err| switch (err) {
16521 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
16522 @tagName(air_tag),
16523 cg.typeOf(bin_op.lhs).fmt(pt),
16524 ops[0].tracking(cg),
16525 ops[1].tracking(cg),
16526 }),
16527 else => |e| return e,
16528 };
16529 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
16530 },
1481816531 .mul, .mul_optimized => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, .mul) else {
1481916532 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
1482016533 const ty = cg.typeOf(bin_op.lhs);
......@@ -127883,6 +129596,7 @@ const Select = struct {
127883129596
127884129597 const Src = union(enum) {
127885129598 none,
129599 any,
127886129600 imm: i16,
127887129601 imm8,
127888129602 imm16,
......@@ -127931,6 +129645,7 @@ const Select = struct {
127931129645 fn matches(src: Src, temp: Temp, cg: *CodeGen) bool {
127932129646 return switch (src) {
127933129647 .none => temp.tracking(cg).short == .none,
129648 .any => true,
127934129649 .imm => |specific_imm| switch (temp.tracking(cg).short) {
127935129650 .immediate => |imm| @as(i64, @bitCast(imm)) == specific_imm,
127936129651 else => false,
......@@ -128045,7 +129760,7 @@ const Select = struct {
128045129760
128046129761 fn convert(src: Src, temp: *Temp, cg: *CodeGen) InnerError!bool {
128047129762 return switch (src) {
128048 .none, .imm, .imm8, .imm16, .imm32, .simm32 => false,
129763 .none, .any, .imm, .imm8, .imm16, .imm32, .simm32 => false,
128049129764 .mem, .to_mem => try temp.toBase(false, cg),
128050129765 .mut_mem, .to_mut_mem => try temp.toBase(true, cg),
128051129766 .to_reg => |reg| try temp.toReg(reg, cg),
......@@ -128079,6 +129794,7 @@ const Select = struct {
128079129794 none,
128080129795 undef,
128081129796 cc: Condition,
129797 imm: u32,
128082129798 ref: Select.Operand.Ref,
128083129799 reg: Register,
128084129800 reg_pair: [2]Register,
......@@ -128168,6 +129884,7 @@ const Select = struct {
128168129884 .any => .{ try cg.tempAlloc(spec.type), true },
128169129885 .none => .{ try cg.tempInit(spec.type, .none), true },
128170129886 .undef => .{ try cg.tempInit(spec.type, .undef), true },
129887 .imm => |imm| .{ try cg.tempInit(spec.type, .{ .immediate = imm }), true },
128171129888 .cc => |cc| .{ try cg.tempInit(spec.type, .{ .eflags = cc }), true },
128172129889 .ref => |ref| .{ ref.tempOf(s), false },
128173129890 .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true },
test/behavior/saturating_arithmetic.zig+1-1
......@@ -127,12 +127,12 @@ test "saturating subtraction" {
127127
128128test "saturating subtraction 128bit" {
129129 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
130 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
131130 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
132131 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
133132 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
134133 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
135134 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
135 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
136136
137137 const S = struct {
138138 fn doTheTest() !void {
test/behavior/x86_64/binary.zig+8
......@@ -5097,6 +5097,14 @@ test subWrap {
50975097 try test_sub_wrap.testIntVectors();
50985098}
50995099
5100inline fn subSat(comptime Type: type, lhs: Type, rhs: Type) Type {
5101 return lhs -| rhs;
5102}
5103test subSat {
5104 const test_sub_sat = binary(subSat, .{});
5105 try test_sub_sat.testInts();
5106}
5107
51005108inline fn mulUnsafe(comptime Type: type, lhs: Type, rhs: Type) DoubleBits(Type) {
51015109 @setRuntimeSafety(false);
51025110 return @as(DoubleBits(Type), lhs) * rhs;