authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-02-21 11:07:57-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-02-22 00:05:47-05:00
log300cb4881f675140d89a8bbd889d51490701fbac
treea446d8f1f1653fe89f6330c3fd23668b4b6e03dc
parentfc7a0c4878dac2d721ec18cafe1b6bcff7faa771

x86_64: rewrite scalar `@bitReverse`


3 files changed, 3431 insertions(+), 184 deletions(-)

src/arch/x86_64/CodeGen.zig+3385-183
......@@ -2418,7 +2418,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24182418}
24192419
24202420fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2421 @setEvalBranchQuota(12_900);
2421 @setEvalBranchQuota(13_600);
24222422 const pt = cg.pt;
24232423 const zcu = pt.zcu;
24242424 const ip = &zcu.intern_pool;
......@@ -2475,7 +2475,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
24752475
24762476 .bitcast => try cg.airBitCast(inst),
24772477
2478 .bit_reverse => try cg.airBitReverse(inst),
24792478 .splat => try cg.airSplat(inst),
24802479 .select => try cg.airSelect(inst),
24812480 .shuffle => try cg.airShuffle(inst),
......@@ -32018,6 +32017,3142 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3201832017 };
3201932018 try res[0].finish(inst, &.{ty_op.operand}, &ops, cg);
3202032019 },
32020 .bit_reverse => |air_tag| if (use_old) try cg.airBitReverse(inst) else fallback: {
32021 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
32022 if (ty_op.ty.toType().isVector(zcu)) break :fallback try cg.airByteSwap(inst);
32023 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
32024 var res: [1]Temp = undefined;
32025 cg.select(&res, &.{ty_op.ty.toType()}, &ops, comptime &.{ .{
32026 .src_constraints = .{ .{ .exact_int = 1 }, .any, .any },
32027 .patterns = &.{
32028 .{ .src = .{ .mut_mem, .none, .none } },
32029 .{ .src = .{ .to_mut_gpr, .none, .none } },
32030 },
32031 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32032 .each = .{ .once = &.{} },
32033 }, .{
32034 .required_features = .{ .avx, .gfni, null, null },
32035 .src_constraints = .{ .{ .exact_int = 8 }, .any, .any },
32036 .patterns = &.{
32037 .{ .src = .{ .to_sse, .none, .none } },
32038 },
32039 .extra_temps = .{
32040 .{ .type = .vector_16_u8, .kind = .forward_bits },
32041 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32042 .unused,
32043 .unused,
32044 .unused,
32045 .unused,
32046 .unused,
32047 .unused,
32048 .unused,
32049 .unused,
32050 .unused,
32051 },
32052 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
32053 .each = .{ .once = &.{
32054 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32055 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp1x), .ui(0) },
32056 } },
32057 }, .{
32058 .required_features = .{ .gfni, null, null, null },
32059 .src_constraints = .{ .{ .exact_int = 8 }, .any, .any },
32060 .patterns = &.{
32061 .{ .src = .{ .to_mut_sse, .none, .none } },
32062 },
32063 .extra_temps = .{
32064 .{ .type = .vector_16_u8, .kind = .forward_bits },
32065 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32066 .unused,
32067 .unused,
32068 .unused,
32069 .unused,
32070 .unused,
32071 .unused,
32072 .unused,
32073 .unused,
32074 .unused,
32075 },
32076 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32077 .each = .{ .once = &.{
32078 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32079 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp1x), .ui(0), ._ },
32080 } },
32081 }, .{
32082 .required_features = .{ .avx2, null, null, null },
32083 .src_constraints = .{ .{ .exact_int = 8 }, .any, .any },
32084 .patterns = &.{
32085 .{ .src = .{ .to_sse, .none, .none } },
32086 },
32087 .extra_temps = .{
32088 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32089 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32090 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32091 .unused,
32092 .unused,
32093 .unused,
32094 .unused,
32095 .unused,
32096 .unused,
32097 .unused,
32098 .unused,
32099 },
32100 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32101 .each = .{ .once = &.{
32102 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32103 .{ ._, .vp_b, .broadcast, .tmp1x, .src0x, ._, ._ },
32104 .{ ._, .v_dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32105 .{ ._, .vp_, .@"and", .tmp1x, .tmp1x, .tmp2x, ._ },
32106 .{ ._, .vp_b, .cmpeq, .tmp1x, .tmp1x, .tmp2x, ._ },
32107 .{ ._, .vp_b, .movmsk, .dst0d, .tmp1x, ._, ._ },
32108 } },
32109 }, .{
32110 .required_features = .{ .avx, null, null, null },
32111 .src_constraints = .{ .{ .exact_int = 8 }, .any, .any },
32112 .patterns = &.{
32113 .{ .src = .{ .to_sse, .none, .none } },
32114 },
32115 .extra_temps = .{
32116 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32117 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32118 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32119 .unused,
32120 .unused,
32121 .unused,
32122 .unused,
32123 .unused,
32124 .unused,
32125 .unused,
32126 .unused,
32127 },
32128 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32129 .each = .{ .once = &.{
32130 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32131 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
32132 .{ ._, .vp_b, .shuf, .tmp1x, .src0x, .tmp2x, ._ },
32133 .{ ._, .v_dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32134 .{ ._, .vp_, .@"and", .tmp1x, .tmp1x, .tmp2x, ._ },
32135 .{ ._, .vp_b, .cmpeq, .tmp1x, .tmp1x, .tmp2x, ._ },
32136 .{ ._, .vp_b, .movmsk, .dst0d, .tmp1x, ._, ._ },
32137 } },
32138 }, .{
32139 .required_features = .{ .ssse3, null, null, null },
32140 .src_constraints = .{ .{ .exact_int = 8 }, .any, .any },
32141 .patterns = &.{
32142 .{ .src = .{ .to_mut_sse, .none, .none } },
32143 },
32144 .extra_temps = .{
32145 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32146 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32147 .unused,
32148 .unused,
32149 .unused,
32150 .unused,
32151 .unused,
32152 .unused,
32153 .unused,
32154 .unused,
32155 .unused,
32156 },
32157 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32158 .each = .{ .once = &.{
32159 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32160 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
32161 .{ ._, .p_b, .shuf, .src0x, .tmp1x, ._, ._ },
32162 .{ ._, ._dqa, .mov, .tmp1x, .lea(.dst0x), ._, ._ },
32163 .{ ._, .p_, .@"and", .src0x, .tmp1x, ._, ._ },
32164 .{ ._, .p_b, .cmpeq, .src0x, .tmp1x, ._, ._ },
32165 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32166 } },
32167 }, .{
32168 .required_features = .{ .sse2, null, null, null },
32169 .src_constraints = .{ .{ .exact_int = 8 }, .any, .any },
32170 .patterns = &.{
32171 .{ .src = .{ .to_mut_sse, .none, .none } },
32172 },
32173 .extra_temps = .{
32174 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32175 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32176 .unused,
32177 .unused,
32178 .unused,
32179 .unused,
32180 .unused,
32181 .unused,
32182 .unused,
32183 .unused,
32184 .unused,
32185 },
32186 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32187 .each = .{ .once = &.{
32188 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32189 .{ ._, .p_, .unpcklbw, .src0x, .src0x, ._, ._ },
32190 .{ ._, ._dqa, .mov, .tmp1x, .lea(.dst0x), ._, ._ },
32191 .{ ._, .p_w, .shufl, .src0x, .src0x, .ui(0b00_00_00_00), ._ },
32192 .{ ._, .p_, .@"and", .src0x, .tmp1x, ._, ._ },
32193 .{ ._, .p_b, .cmpeq, .src0x, .tmp1x, ._, ._ },
32194 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32195 } },
32196 }, .{
32197 .src_constraints = .{ .{ .exact_int = 8 }, .any, .any },
32198 .patterns = &.{
32199 .{ .src = .{ .to_mut_gpr, .none, .none } },
32200 },
32201 .extra_temps = .{
32202 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32203 .unused,
32204 .unused,
32205 .unused,
32206 .unused,
32207 .unused,
32208 .unused,
32209 .unused,
32210 .unused,
32211 .unused,
32212 .unused,
32213 },
32214 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32215 .clobbers = .{ .eflags = true },
32216 .each = .{ .once = &.{
32217 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
32218 .{ ._, ._r, .sh, .src0b, .ui(4), ._, ._ },
32219 .{ ._, ._l, .sh, .tmp0b, .ui(4), ._, ._ },
32220 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32221 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32222 .{ ._, ._r, .sh, .dst0b, .ui(2), ._, ._ },
32223 .{ ._, ._l, .sh, .tmp0b, .ui(2), ._, ._ },
32224 .{ ._, ._, .@"and", .dst0b, .ui(0b00110011), ._, ._ },
32225 .{ ._, ._, .@"and", .tmp0b, .ui(0b11001100), ._, ._ },
32226 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32227 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32228 .{ ._, ._r, .sh, .dst0b, .ui(1), ._, ._ },
32229 .{ ._, ._l, .sh, .tmp0b, .ui(1), ._, ._ },
32230 .{ ._, ._, .@"and", .dst0b, .ui(0b01010101), ._, ._ },
32231 .{ ._, ._, .@"and", .tmp0b, .ui(0b10101010), ._, ._ },
32232 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32233 } },
32234 }, .{
32235 .required_features = .{ .avx, .gfni, null, null },
32236 .src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
32237 .patterns = &.{
32238 .{ .src = .{ .to_sse, .none, .none } },
32239 },
32240 .extra_temps = .{
32241 .{ .type = .vector_16_u8, .kind = .forward_bits },
32242 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32243 .unused,
32244 .unused,
32245 .unused,
32246 .unused,
32247 .unused,
32248 .unused,
32249 .unused,
32250 .unused,
32251 .unused,
32252 },
32253 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
32254 .each = .{ .once = &.{
32255 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32256 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp1x), .ui(0) },
32257 .{ ._, .vp_, .unpcklbw, .dst0x, .dst0x, .dst0x, ._ },
32258 .{ ._, .vp_w, .sra, .dst0x, .dst0x, .uia(16, .dst0, .sub_bit_size), ._ },
32259 } },
32260 }, .{
32261 .required_features = .{ .gfni, null, null, null },
32262 .src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
32263 .patterns = &.{
32264 .{ .src = .{ .to_mut_sse, .none, .none } },
32265 },
32266 .extra_temps = .{
32267 .{ .type = .vector_16_u8, .kind = .forward_bits },
32268 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32269 .unused,
32270 .unused,
32271 .unused,
32272 .unused,
32273 .unused,
32274 .unused,
32275 .unused,
32276 .unused,
32277 .unused,
32278 },
32279 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32280 .each = .{ .once = &.{
32281 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32282 .{ ._, ._b, .gf2p8affineq, .src0x, .lea(.tmp1x), .ui(0), ._ },
32283 .{ ._, .p_, .unpcklbw, .src0x, .src0x, ._, ._ },
32284 .{ ._, .p_w, .sra, .src0x, .uia(16, .dst0, .sub_bit_size), ._, ._ },
32285 } },
32286 }, .{
32287 .required_features = .{ .avx2, null, null, null },
32288 .src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
32289 .patterns = &.{
32290 .{ .src = .{ .to_sse, .none, .none } },
32291 },
32292 .extra_temps = .{
32293 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32294 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32295 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32296 .unused,
32297 .unused,
32298 .unused,
32299 .unused,
32300 .unused,
32301 .unused,
32302 .unused,
32303 .unused,
32304 },
32305 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32306 .clobbers = .{ .eflags = true },
32307 .each = .{ .once = &.{
32308 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32309 .{ ._, .vp_b, .broadcast, .tmp1x, .src0x, ._, ._ },
32310 .{ ._, .v_dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32311 .{ ._, .vp_, .@"and", .tmp1x, .tmp1x, .tmp2x, ._ },
32312 .{ ._, .vp_b, .cmpeq, .tmp1x, .tmp1x, .tmp2x, ._ },
32313 .{ ._, .vp_b, .movmsk, .dst0d, .tmp1x, ._, ._ },
32314 .{ ._, ._r, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32315 } },
32316 }, .{
32317 .required_features = .{ .avx, null, null, null },
32318 .src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
32319 .patterns = &.{
32320 .{ .src = .{ .to_sse, .none, .none } },
32321 },
32322 .extra_temps = .{
32323 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32324 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32325 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32326 .unused,
32327 .unused,
32328 .unused,
32329 .unused,
32330 .unused,
32331 .unused,
32332 .unused,
32333 .unused,
32334 },
32335 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32336 .clobbers = .{ .eflags = true },
32337 .each = .{ .once = &.{
32338 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32339 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
32340 .{ ._, .vp_b, .shuf, .tmp1x, .src0x, .tmp2x, ._ },
32341 .{ ._, .v_dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32342 .{ ._, .vp_, .@"and", .tmp1x, .tmp1x, .tmp2x, ._ },
32343 .{ ._, .vp_b, .cmpeq, .tmp1x, .tmp1x, .tmp2x, ._ },
32344 .{ ._, .vp_b, .movmsk, .dst0d, .tmp1x, ._, ._ },
32345 .{ ._, ._r, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32346 } },
32347 }, .{
32348 .required_features = .{ .ssse3, null, null, null },
32349 .src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
32350 .patterns = &.{
32351 .{ .src = .{ .to_mut_sse, .none, .none } },
32352 },
32353 .extra_temps = .{
32354 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32355 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32356 .unused,
32357 .unused,
32358 .unused,
32359 .unused,
32360 .unused,
32361 .unused,
32362 .unused,
32363 .unused,
32364 .unused,
32365 },
32366 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32367 .clobbers = .{ .eflags = true },
32368 .each = .{ .once = &.{
32369 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32370 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
32371 .{ ._, .p_b, .shuf, .src0x, .tmp1x, ._, ._ },
32372 .{ ._, ._dqa, .mov, .tmp1x, .lea(.dst0x), ._, ._ },
32373 .{ ._, .p_, .@"and", .src0x, .tmp1x, ._, ._ },
32374 .{ ._, .p_b, .cmpeq, .src0x, .tmp1x, ._, ._ },
32375 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32376 .{ ._, ._r, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32377 } },
32378 }, .{
32379 .required_features = .{ .sse2, null, null, null },
32380 .src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
32381 .patterns = &.{
32382 .{ .src = .{ .to_mut_sse, .none, .none } },
32383 },
32384 .extra_temps = .{
32385 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32386 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32387 .unused,
32388 .unused,
32389 .unused,
32390 .unused,
32391 .unused,
32392 .unused,
32393 .unused,
32394 .unused,
32395 .unused,
32396 },
32397 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32398 .clobbers = .{ .eflags = true },
32399 .each = .{ .once = &.{
32400 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32401 .{ ._, .p_, .unpcklbw, .src0x, .src0x, ._, ._ },
32402 .{ ._, ._dqa, .mov, .tmp1x, .lea(.dst0x), ._, ._ },
32403 .{ ._, .p_w, .shufl, .src0x, .src0x, .ui(0b00_00_00_00), ._ },
32404 .{ ._, .p_, .@"and", .src0x, .tmp1x, ._, ._ },
32405 .{ ._, .p_b, .cmpeq, .src0x, .tmp1x, ._, ._ },
32406 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32407 .{ ._, ._r, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32408 } },
32409 }, .{
32410 .src_constraints = .{ .{ .signed_int = .byte }, .any, .any },
32411 .patterns = &.{
32412 .{ .src = .{ .to_mut_gpr, .none, .none } },
32413 },
32414 .extra_temps = .{
32415 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32416 .unused,
32417 .unused,
32418 .unused,
32419 .unused,
32420 .unused,
32421 .unused,
32422 .unused,
32423 .unused,
32424 .unused,
32425 .unused,
32426 },
32427 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32428 .clobbers = .{ .eflags = true },
32429 .each = .{ .once = &.{
32430 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
32431 .{ ._, ._r, .sh, .src0b, .ui(4), ._, ._ },
32432 .{ ._, ._l, .sh, .tmp0b, .ui(4), ._, ._ },
32433 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32434 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32435 .{ ._, ._r, .sh, .dst0b, .ui(2), ._, ._ },
32436 .{ ._, ._l, .sh, .tmp0b, .ui(2), ._, ._ },
32437 .{ ._, ._, .@"and", .dst0b, .ui(0b00110011), ._, ._ },
32438 .{ ._, ._, .@"and", .tmp0b, .ui(0b11001100), ._, ._ },
32439 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32440 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32441 .{ ._, ._r, .sh, .dst0b, .ui(1), ._, ._ },
32442 .{ ._, ._l, .sh, .tmp0b, .ui(1), ._, ._ },
32443 .{ ._, ._, .@"and", .dst0b, .ui(0b01010101), ._, ._ },
32444 .{ ._, ._, .@"and", .tmp0b, .ui(0b10101010), ._, ._ },
32445 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32446 .{ ._, ._r, .sa, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32447 } },
32448 }, .{
32449 .required_features = .{ .avx, .gfni, null, null },
32450 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
32451 .patterns = &.{
32452 .{ .src = .{ .to_sse, .none, .none } },
32453 },
32454 .extra_temps = .{
32455 .{ .type = .vector_16_u8, .kind = .forward_bits },
32456 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32457 .unused,
32458 .unused,
32459 .unused,
32460 .unused,
32461 .unused,
32462 .unused,
32463 .unused,
32464 .unused,
32465 .unused,
32466 },
32467 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
32468 .each = .{ .once = &.{
32469 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32470 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp1x), .ui(0) },
32471 .{ ._, .vp_, .unpcklbw, .dst0x, .dst0x, .dst0x, ._ },
32472 .{ ._, .vp_w, .srl, .dst0x, .dst0x, .uia(16, .dst0, .sub_bit_size), ._ },
32473 } },
32474 }, .{
32475 .required_features = .{ .gfni, null, null, null },
32476 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
32477 .patterns = &.{
32478 .{ .src = .{ .to_mut_sse, .none, .none } },
32479 },
32480 .extra_temps = .{
32481 .{ .type = .vector_16_u8, .kind = .forward_bits },
32482 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32483 .unused,
32484 .unused,
32485 .unused,
32486 .unused,
32487 .unused,
32488 .unused,
32489 .unused,
32490 .unused,
32491 .unused,
32492 },
32493 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32494 .each = .{ .once = &.{
32495 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32496 .{ ._, ._b, .gf2p8affineq, .src0x, .lea(.tmp1x), .ui(0), ._ },
32497 .{ ._, .p_, .unpcklbw, .src0x, .src0x, ._, ._ },
32498 .{ ._, .p_w, .srl, .src0x, .uia(16, .dst0, .sub_bit_size), ._, ._ },
32499 } },
32500 }, .{
32501 .required_features = .{ .avx2, null, null, null },
32502 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
32503 .patterns = &.{
32504 .{ .src = .{ .to_sse, .none, .none } },
32505 },
32506 .extra_temps = .{
32507 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32508 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32509 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32510 .unused,
32511 .unused,
32512 .unused,
32513 .unused,
32514 .unused,
32515 .unused,
32516 .unused,
32517 .unused,
32518 },
32519 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32520 .clobbers = .{ .eflags = true },
32521 .each = .{ .once = &.{
32522 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32523 .{ ._, .vp_b, .broadcast, .tmp1x, .src0x, ._, ._ },
32524 .{ ._, .v_dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32525 .{ ._, .vp_, .@"and", .tmp1x, .tmp1x, .tmp2x, ._ },
32526 .{ ._, .vp_b, .cmpeq, .tmp1x, .tmp1x, .tmp2x, ._ },
32527 .{ ._, .vp_b, .movmsk, .dst0d, .tmp1x, ._, ._ },
32528 .{ ._, ._r, .sh, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32529 } },
32530 }, .{
32531 .required_features = .{ .avx, null, null, null },
32532 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
32533 .patterns = &.{
32534 .{ .src = .{ .to_sse, .none, .none } },
32535 },
32536 .extra_temps = .{
32537 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32538 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32539 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32540 .unused,
32541 .unused,
32542 .unused,
32543 .unused,
32544 .unused,
32545 .unused,
32546 .unused,
32547 .unused,
32548 },
32549 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32550 .clobbers = .{ .eflags = true },
32551 .each = .{ .once = &.{
32552 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32553 .{ ._, .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
32554 .{ ._, .vp_b, .shuf, .tmp1x, .src0x, .tmp2x, ._ },
32555 .{ ._, .v_dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32556 .{ ._, .vp_, .@"and", .tmp1x, .tmp1x, .tmp2x, ._ },
32557 .{ ._, .vp_b, .cmpeq, .tmp1x, .tmp1x, .tmp2x, ._ },
32558 .{ ._, .vp_b, .movmsk, .dst0d, .tmp1x, ._, ._ },
32559 .{ ._, ._r, .sh, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32560 } },
32561 }, .{
32562 .required_features = .{ .ssse3, null, null, null },
32563 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
32564 .patterns = &.{
32565 .{ .src = .{ .to_mut_sse, .none, .none } },
32566 },
32567 .extra_temps = .{
32568 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32569 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32570 .unused,
32571 .unused,
32572 .unused,
32573 .unused,
32574 .unused,
32575 .unused,
32576 .unused,
32577 .unused,
32578 .unused,
32579 },
32580 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32581 .clobbers = .{ .eflags = true },
32582 .each = .{ .once = &.{
32583 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32584 .{ ._, .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
32585 .{ ._, .p_b, .shuf, .src0x, .tmp1x, ._, ._ },
32586 .{ ._, ._dqa, .mov, .tmp1x, .lea(.dst0x), ._, ._ },
32587 .{ ._, .p_, .@"and", .src0x, .tmp1x, ._, ._ },
32588 .{ ._, .p_b, .cmpeq, .src0x, .tmp1x, ._, ._ },
32589 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32590 .{ ._, ._r, .sh, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32591 } },
32592 }, .{
32593 .required_features = .{ .sse2, null, null, null },
32594 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
32595 .patterns = &.{
32596 .{ .src = .{ .to_mut_sse, .none, .none } },
32597 },
32598 .extra_temps = .{
32599 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32600 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32601 .unused,
32602 .unused,
32603 .unused,
32604 .unused,
32605 .unused,
32606 .unused,
32607 .unused,
32608 .unused,
32609 .unused,
32610 },
32611 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32612 .clobbers = .{ .eflags = true },
32613 .each = .{ .once = &.{
32614 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32615 .{ ._, .p_, .unpcklbw, .src0x, .src0x, ._, ._ },
32616 .{ ._, ._dqa, .mov, .tmp1x, .lea(.dst0x), ._, ._ },
32617 .{ ._, .p_w, .shufl, .src0x, .src0x, .ui(0b00_00_00_00), ._ },
32618 .{ ._, .p_, .@"and", .src0x, .tmp1x, ._, ._ },
32619 .{ ._, .p_b, .cmpeq, .src0x, .tmp1x, ._, ._ },
32620 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32621 .{ ._, ._r, .sh, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32622 } },
32623 }, .{
32624 .src_constraints = .{ .{ .unsigned_int = .byte }, .any, .any },
32625 .patterns = &.{
32626 .{ .src = .{ .to_mut_gpr, .none, .none } },
32627 },
32628 .extra_temps = .{
32629 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
32630 .unused,
32631 .unused,
32632 .unused,
32633 .unused,
32634 .unused,
32635 .unused,
32636 .unused,
32637 .unused,
32638 .unused,
32639 .unused,
32640 },
32641 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32642 .clobbers = .{ .eflags = true },
32643 .each = .{ .once = &.{
32644 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
32645 .{ ._, ._r, .sh, .src0b, .ui(4), ._, ._ },
32646 .{ ._, ._l, .sh, .tmp0b, .ui(4), ._, ._ },
32647 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32648 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32649 .{ ._, ._r, .sh, .dst0b, .ui(2), ._, ._ },
32650 .{ ._, ._l, .sh, .tmp0b, .ui(2), ._, ._ },
32651 .{ ._, ._, .@"and", .dst0b, .ui(0b00110011), ._, ._ },
32652 .{ ._, ._, .@"and", .tmp0b, .ui(0b11001100), ._, ._ },
32653 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32654 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32655 .{ ._, ._r, .sh, .dst0b, .ui(1), ._, ._ },
32656 .{ ._, ._l, .sh, .tmp0b, .ui(1), ._, ._ },
32657 .{ ._, ._, .@"and", .dst0b, .ui(0b01010101), ._, ._ },
32658 .{ ._, ._, .@"and", .tmp0b, .ui(0b10101010), ._, ._ },
32659 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
32660 .{ ._, ._r, .sh, .dst0b, .uia(8, .dst0, .sub_bit_size), ._, ._ },
32661 } },
32662 }, .{
32663 .required_features = .{ .avx, .gfni, null, null },
32664 .src_constraints = .{ .{ .exact_int = 16 }, .any, .any },
32665 .patterns = &.{
32666 .{ .src = .{ .to_sse, .none, .none } },
32667 },
32668 .extra_temps = .{
32669 .{ .type = .vector_16_u8, .kind = .forward_bits },
32670 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word } } },
32671 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32672 .unused,
32673 .unused,
32674 .unused,
32675 .unused,
32676 .unused,
32677 .unused,
32678 .unused,
32679 .unused,
32680 },
32681 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
32682 .each = .{ .once = &.{
32683 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
32684 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
32685 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
32686 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
32687 } },
32688 }, .{
32689 .required_features = .{ .ssse3, .gfni, null, null },
32690 .src_constraints = .{ .{ .exact_int = 16 }, .any, .any },
32691 .patterns = &.{
32692 .{ .src = .{ .to_mut_sse, .none, .none } },
32693 },
32694 .extra_temps = .{
32695 .{ .type = .vector_16_u8, .kind = .forward_bits },
32696 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word } } },
32697 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32698 .unused,
32699 .unused,
32700 .unused,
32701 .unused,
32702 .unused,
32703 .unused,
32704 .unused,
32705 .unused,
32706 },
32707 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32708 .each = .{ .once = &.{
32709 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
32710 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
32711 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
32712 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
32713 } },
32714 }, .{
32715 .required_features = .{ .gfni, null, null, null },
32716 .src_constraints = .{ .{ .exact_int = 16 }, .any, .any },
32717 .patterns = &.{
32718 .{ .src = .{ .to_mut_sse, .none, .none } },
32719 },
32720 .extra_temps = .{
32721 .{ .type = .vector_16_u8, .kind = .forward_bits },
32722 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32723 .unused,
32724 .unused,
32725 .unused,
32726 .unused,
32727 .unused,
32728 .unused,
32729 .unused,
32730 .unused,
32731 .unused,
32732 },
32733 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32734 .each = .{ .once = &.{
32735 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32736 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp1x), .ui(0), ._ },
32737 .{ ._, .p_, .unpcklwd, .dst0x, .dst0x, ._, ._ },
32738 .{ ._, .p_dq, .srl, .dst0x, .ui(1), ._, ._ },
32739 } },
32740 }, .{
32741 .required_features = .{ .avx, null, null, null },
32742 .src_constraints = .{ .{ .exact_int = 16 }, .any, .any },
32743 .patterns = &.{
32744 .{ .src = .{ .to_sse, .none, .none } },
32745 },
32746 .extra_temps = .{
32747 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word, .smear = 8 } } },
32748 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32749 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32750 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32751 .unused,
32752 .unused,
32753 .unused,
32754 .unused,
32755 .unused,
32756 .unused,
32757 .unused,
32758 },
32759 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32760 .each = .{ .once = &.{
32761 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32762 .{ ._, .vp_b, .shuf, .tmp2x, .src0x, .lea(.dst0x), ._ },
32763 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
32764 .{ ._, .v_dqa, .mov, .tmp3x, .lea(.dst0x), ._, ._ },
32765 .{ ._, .vp_, .@"and", .tmp2x, .tmp2x, .tmp3x, ._ },
32766 .{ ._, .vp_b, .cmpeq, .tmp2x, .tmp2x, .tmp3x, ._ },
32767 .{ ._, .vp_b, .movmsk, .dst0d, .tmp2x, ._, ._ },
32768 } },
32769 }, .{
32770 .required_features = .{ .ssse3, null, null, null },
32771 .src_constraints = .{ .{ .exact_int = 16 }, .any, .any },
32772 .patterns = &.{
32773 .{ .src = .{ .to_mut_sse, .none, .none } },
32774 },
32775 .extra_temps = .{
32776 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word, .smear = 8 } } },
32777 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32778 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32779 .unused,
32780 .unused,
32781 .unused,
32782 .unused,
32783 .unused,
32784 .unused,
32785 .unused,
32786 .unused,
32787 },
32788 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32789 .each = .{ .once = &.{
32790 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32791 .{ ._, .p_b, .shuf, .src0x, .lea(.dst0x), ._, ._ },
32792 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
32793 .{ ._, ._dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32794 .{ ._, .p_, .@"and", .src0x, .tmp2x, ._, ._ },
32795 .{ ._, .p_b, .cmpeq, .src0x, .tmp2x, ._, ._ },
32796 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32797 } },
32798 }, .{
32799 .src_constraints = .{ .{ .exact_int = 16 }, .any, .any },
32800 .patterns = &.{
32801 .{ .src = .{ .to_mut_gpr, .none, .none } },
32802 },
32803 .extra_temps = .{
32804 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
32805 .unused,
32806 .unused,
32807 .unused,
32808 .unused,
32809 .unused,
32810 .unused,
32811 .unused,
32812 .unused,
32813 .unused,
32814 .unused,
32815 },
32816 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32817 .clobbers = .{ .eflags = true },
32818 .each = .{ .once = &.{
32819 .{ ._, ._r, .ro, .src0w, .ui(8), ._, ._ },
32820 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
32821 .{ ._, ._r, .sh, .src0d, .ui(4), ._, ._ },
32822 .{ ._, ._l, .sh, .tmp0d, .ui(4), ._, ._ },
32823 .{ ._, ._, .@"and", .src0d, .ui(0b0000111100001111), ._, ._ },
32824 .{ ._, ._, .@"and", .tmp0d, .ui(0b1111000011110000), ._, ._ },
32825 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
32826 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32827 .{ ._, ._r, .sh, .dst0d, .ui(2), ._, ._ },
32828 .{ ._, ._l, .sh, .tmp0d, .ui(2), ._, ._ },
32829 .{ ._, ._, .@"and", .dst0d, .ui(0b0011001100110011), ._, ._ },
32830 .{ ._, ._, .@"and", .tmp0d, .ui(0b1100110011001100), ._, ._ },
32831 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
32832 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
32833 .{ ._, ._r, .sh, .dst0d, .ui(1), ._, ._ },
32834 .{ ._, ._l, .sh, .tmp0d, .ui(1), ._, ._ },
32835 .{ ._, ._, .@"and", .dst0d, .ui(0b0101010101010101), ._, ._ },
32836 .{ ._, ._, .@"and", .tmp0d, .ui(0b1010101010101010), ._, ._ },
32837 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
32838 } },
32839 }, .{
32840 .required_features = .{ .avx, .gfni, null, null },
32841 .src_constraints = .{ .{ .signed_int = .word }, .any, .any },
32842 .patterns = &.{
32843 .{ .src = .{ .to_sse, .none, .none } },
32844 },
32845 .extra_temps = .{
32846 .{ .type = .vector_16_u8, .kind = .forward_bits },
32847 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word } } },
32848 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32849 .unused,
32850 .unused,
32851 .unused,
32852 .unused,
32853 .unused,
32854 .unused,
32855 .unused,
32856 .unused,
32857 },
32858 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
32859 .each = .{ .once = &.{
32860 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
32861 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
32862 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
32863 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
32864 .{ ._, .vp_w, .sra, .dst0x, .dst0x, .uia(16, .dst0, .sub_bit_size), ._ },
32865 } },
32866 }, .{
32867 .required_features = .{ .ssse3, .gfni, null, null },
32868 .src_constraints = .{ .{ .signed_int = .word }, .any, .any },
32869 .patterns = &.{
32870 .{ .src = .{ .to_mut_sse, .none, .none } },
32871 },
32872 .extra_temps = .{
32873 .{ .type = .vector_16_u8, .kind = .forward_bits },
32874 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word } } },
32875 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32876 .unused,
32877 .unused,
32878 .unused,
32879 .unused,
32880 .unused,
32881 .unused,
32882 .unused,
32883 .unused,
32884 },
32885 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32886 .each = .{ .once = &.{
32887 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
32888 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
32889 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
32890 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
32891 .{ ._, .p_w, .sra, .dst0x, .uia(16, .dst0, .sub_bit_size), ._, ._ },
32892 } },
32893 }, .{
32894 .required_features = .{ .gfni, null, null, null },
32895 .src_constraints = .{ .{ .signed_int = .word }, .any, .any },
32896 .patterns = &.{
32897 .{ .src = .{ .to_mut_sse, .none, .none } },
32898 },
32899 .extra_temps = .{
32900 .{ .type = .vector_16_u8, .kind = .forward_bits },
32901 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
32902 .unused,
32903 .unused,
32904 .unused,
32905 .unused,
32906 .unused,
32907 .unused,
32908 .unused,
32909 .unused,
32910 .unused,
32911 },
32912 .dst_temps = .{ .{ .ref = .src0 }, .unused },
32913 .each = .{ .once = &.{
32914 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
32915 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp1x), .ui(0), ._ },
32916 .{ ._, .p_, .unpcklwd, .dst0x, .dst0x, ._, ._ },
32917 .{ ._, .p_dq, .srl, .dst0x, .ui(1), ._, ._ },
32918 .{ ._, .p_w, .sra, .dst0x, .uia(16, .dst0, .sub_bit_size), ._, ._ },
32919 } },
32920 }, .{
32921 .required_features = .{ .avx, null, null, null },
32922 .src_constraints = .{ .{ .signed_int = .word }, .any, .any },
32923 .patterns = &.{
32924 .{ .src = .{ .to_sse, .none, .none } },
32925 },
32926 .extra_temps = .{
32927 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word, .smear = 8 } } },
32928 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32929 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
32930 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32931 .unused,
32932 .unused,
32933 .unused,
32934 .unused,
32935 .unused,
32936 .unused,
32937 .unused,
32938 },
32939 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32940 .clobbers = .{ .eflags = true },
32941 .each = .{ .once = &.{
32942 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32943 .{ ._, .vp_b, .shuf, .tmp2x, .src0x, .lea(.dst0x), ._ },
32944 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
32945 .{ ._, .v_dqa, .mov, .tmp3x, .lea(.dst0x), ._, ._ },
32946 .{ ._, .vp_, .@"and", .tmp2x, .tmp2x, .tmp3x, ._ },
32947 .{ ._, .vp_b, .cmpeq, .tmp2x, .tmp2x, .tmp3x, ._ },
32948 .{ ._, .vp_b, .movmsk, .dst0d, .tmp2x, ._, ._ },
32949 .{ ._, ._r, .sa, .dst0w, .uia(16, .dst0, .sub_bit_size), ._, ._ },
32950 } },
32951 }, .{
32952 .required_features = .{ .ssse3, null, null, null },
32953 .src_constraints = .{ .{ .signed_int = .word }, .any, .any },
32954 .patterns = &.{
32955 .{ .src = .{ .to_mut_sse, .none, .none } },
32956 },
32957 .extra_temps = .{
32958 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word, .smear = 8 } } },
32959 .{ .type = .vector_16_u8, .kind = .reverse_bits },
32960 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
32961 .unused,
32962 .unused,
32963 .unused,
32964 .unused,
32965 .unused,
32966 .unused,
32967 .unused,
32968 .unused,
32969 },
32970 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
32971 .clobbers = .{ .eflags = true },
32972 .each = .{ .once = &.{
32973 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
32974 .{ ._, .p_b, .shuf, .src0x, .lea(.dst0x), ._, ._ },
32975 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
32976 .{ ._, ._dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
32977 .{ ._, .p_, .@"and", .src0x, .tmp2x, ._, ._ },
32978 .{ ._, .p_b, .cmpeq, .src0x, .tmp2x, ._, ._ },
32979 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
32980 .{ ._, ._r, .sa, .dst0w, .uia(16, .dst0, .sub_bit_size), ._, ._ },
32981 } },
32982 }, .{
32983 .src_constraints = .{ .{ .signed_int = .word }, .any, .any },
32984 .patterns = &.{
32985 .{ .src = .{ .to_mut_gpr, .none, .none } },
32986 },
32987 .extra_temps = .{
32988 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
32989 .unused,
32990 .unused,
32991 .unused,
32992 .unused,
32993 .unused,
32994 .unused,
32995 .unused,
32996 .unused,
32997 .unused,
32998 .unused,
32999 },
33000 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33001 .clobbers = .{ .eflags = true },
33002 .each = .{ .once = &.{
33003 .{ ._, ._r, .ro, .src0w, .ui(8), ._, ._ },
33004 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
33005 .{ ._, ._r, .sh, .src0d, .ui(4), ._, ._ },
33006 .{ ._, ._l, .sh, .tmp0d, .ui(4), ._, ._ },
33007 .{ ._, ._, .@"and", .src0d, .ui(0b0000111100001111), ._, ._ },
33008 .{ ._, ._, .@"and", .tmp0d, .ui(0b1111000011110000), ._, ._ },
33009 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33010 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33011 .{ ._, ._r, .sh, .dst0d, .ui(2), ._, ._ },
33012 .{ ._, ._l, .sh, .tmp0d, .ui(2), ._, ._ },
33013 .{ ._, ._, .@"and", .dst0d, .ui(0b0011001100110011), ._, ._ },
33014 .{ ._, ._, .@"and", .tmp0d, .ui(0b1100110011001100), ._, ._ },
33015 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33016 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33017 .{ ._, ._r, .sh, .dst0d, .ui(1), ._, ._ },
33018 .{ ._, ._l, .sh, .tmp0d, .ui(1), ._, ._ },
33019 .{ ._, ._, .@"and", .dst0d, .ui(0b0101010101010101), ._, ._ },
33020 .{ ._, ._, .@"and", .tmp0d, .ui(0b1010101010101010), ._, ._ },
33021 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33022 .{ ._, ._r, .sa, .dst0w, .uia(16, .dst0, .sub_bit_size), ._, ._ },
33023 } },
33024 }, .{
33025 .required_features = .{ .avx, .gfni, null, null },
33026 .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any },
33027 .patterns = &.{
33028 .{ .src = .{ .to_sse, .none, .none } },
33029 },
33030 .extra_temps = .{
33031 .{ .type = .vector_16_u8, .kind = .forward_bits },
33032 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word } } },
33033 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33034 .unused,
33035 .unused,
33036 .unused,
33037 .unused,
33038 .unused,
33039 .unused,
33040 .unused,
33041 .unused,
33042 },
33043 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
33044 .each = .{ .once = &.{
33045 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33046 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
33047 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33048 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
33049 .{ ._, .vp_w, .srl, .dst0x, .dst0x, .uia(16, .dst0, .sub_bit_size), ._ },
33050 } },
33051 }, .{
33052 .required_features = .{ .ssse3, .gfni, null, null },
33053 .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any },
33054 .patterns = &.{
33055 .{ .src = .{ .to_mut_sse, .none, .none } },
33056 },
33057 .extra_temps = .{
33058 .{ .type = .vector_16_u8, .kind = .forward_bits },
33059 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word } } },
33060 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33061 .unused,
33062 .unused,
33063 .unused,
33064 .unused,
33065 .unused,
33066 .unused,
33067 .unused,
33068 .unused,
33069 },
33070 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33071 .each = .{ .once = &.{
33072 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33073 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
33074 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33075 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
33076 .{ ._, .p_w, .srl, .dst0x, .uia(16, .dst0, .sub_bit_size), ._, ._ },
33077 } },
33078 }, .{
33079 .required_features = .{ .gfni, null, null, null },
33080 .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any },
33081 .patterns = &.{
33082 .{ .src = .{ .to_mut_sse, .none, .none } },
33083 },
33084 .extra_temps = .{
33085 .{ .type = .vector_16_u8, .kind = .forward_bits },
33086 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33087 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
33088 .unused,
33089 .unused,
33090 .unused,
33091 .unused,
33092 .unused,
33093 .unused,
33094 .unused,
33095 .unused,
33096 },
33097 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33098 .each = .{ .once = &.{
33099 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
33100 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp1x), .ui(0), ._ },
33101 .{ ._, ._dqa, .mov, .tmp2x, .dst0x, ._, ._ },
33102 .{ ._, .p_w, .srl, .dst0x, .uia(24, .dst0, .sub_bit_size), ._, ._ },
33103 .{ ._, .p_w, .sll, .tmp2x, .sia(-8, .dst0, .add_bit_size), ._, ._ },
33104 .{ ._, .p_, .@"or", .dst0x, .tmp2x, ._, ._ },
33105 } },
33106 }, .{
33107 .required_features = .{ .avx, null, null, null },
33108 .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any },
33109 .patterns = &.{
33110 .{ .src = .{ .to_sse, .none, .none } },
33111 },
33112 .extra_temps = .{
33113 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word, .smear = 8 } } },
33114 .{ .type = .vector_16_u8, .kind = .reverse_bits },
33115 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
33116 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
33117 .unused,
33118 .unused,
33119 .unused,
33120 .unused,
33121 .unused,
33122 .unused,
33123 .unused,
33124 },
33125 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33126 .clobbers = .{ .eflags = true },
33127 .each = .{ .once = &.{
33128 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33129 .{ ._, .vp_b, .shuf, .tmp2x, .src0x, .lea(.dst0x), ._ },
33130 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
33131 .{ ._, .v_dqa, .mov, .tmp3x, .lea(.dst0x), ._, ._ },
33132 .{ ._, .vp_, .@"and", .tmp2x, .tmp2x, .tmp3x, ._ },
33133 .{ ._, .vp_b, .cmpeq, .tmp2x, .tmp2x, .tmp3x, ._ },
33134 .{ ._, .vp_b, .movmsk, .dst0d, .tmp2x, ._, ._ },
33135 .{ ._, ._r, .sh, .dst0d, .uia(16, .dst0, .sub_bit_size), ._, ._ },
33136 } },
33137 }, .{
33138 .required_features = .{ .ssse3, null, null, null },
33139 .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any },
33140 .patterns = &.{
33141 .{ .src = .{ .to_mut_sse, .none, .none } },
33142 },
33143 .extra_temps = .{
33144 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .word, .smear = 8 } } },
33145 .{ .type = .vector_16_u8, .kind = .reverse_bits },
33146 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
33147 .unused,
33148 .unused,
33149 .unused,
33150 .unused,
33151 .unused,
33152 .unused,
33153 .unused,
33154 .unused,
33155 },
33156 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33157 .clobbers = .{ .eflags = true },
33158 .each = .{ .once = &.{
33159 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33160 .{ ._, .p_b, .shuf, .src0x, .lea(.dst0x), ._, ._ },
33161 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
33162 .{ ._, ._dqa, .mov, .tmp2x, .lea(.dst0x), ._, ._ },
33163 .{ ._, .p_, .@"and", .src0x, .tmp2x, ._, ._ },
33164 .{ ._, .p_b, .cmpeq, .src0x, .tmp2x, ._, ._ },
33165 .{ ._, .p_b, .movmsk, .dst0d, .src0x, ._, ._ },
33166 .{ ._, ._r, .sh, .dst0w, .uia(16, .dst0, .sub_bit_size), ._, ._ },
33167 } },
33168 }, .{
33169 .src_constraints = .{ .{ .unsigned_int = .word }, .any, .any },
33170 .patterns = &.{
33171 .{ .src = .{ .to_mut_gpr, .none, .none } },
33172 },
33173 .extra_temps = .{
33174 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
33175 .unused,
33176 .unused,
33177 .unused,
33178 .unused,
33179 .unused,
33180 .unused,
33181 .unused,
33182 .unused,
33183 .unused,
33184 .unused,
33185 },
33186 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33187 .clobbers = .{ .eflags = true },
33188 .each = .{ .once = &.{
33189 .{ ._, ._r, .ro, .src0w, .ui(8), ._, ._ },
33190 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
33191 .{ ._, ._r, .sh, .src0d, .ui(4), ._, ._ },
33192 .{ ._, ._l, .sh, .tmp0d, .ui(4), ._, ._ },
33193 .{ ._, ._, .@"and", .src0d, .ui(0b0000111100001111), ._, ._ },
33194 .{ ._, ._, .@"and", .tmp0d, .ui(0b1111000011110000), ._, ._ },
33195 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33196 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33197 .{ ._, ._r, .sh, .dst0d, .ui(2), ._, ._ },
33198 .{ ._, ._l, .sh, .tmp0d, .ui(2), ._, ._ },
33199 .{ ._, ._, .@"and", .dst0d, .ui(0b0011001100110011), ._, ._ },
33200 .{ ._, ._, .@"and", .tmp0d, .ui(0b1100110011001100), ._, ._ },
33201 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33202 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33203 .{ ._, ._r, .sh, .dst0d, .ui(1), ._, ._ },
33204 .{ ._, ._l, .sh, .tmp0d, .ui(1), ._, ._ },
33205 .{ ._, ._, .@"and", .dst0d, .ui(0b0101010101010101), ._, ._ },
33206 .{ ._, ._, .@"and", .tmp0d, .ui(0b1010101010101010), ._, ._ },
33207 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33208 .{ ._, ._r, .sh, .dst0d, .uia(16, .dst0, .sub_bit_size), ._, ._ },
33209 } },
33210 }, .{
33211 .required_features = .{ .avx, .gfni, null, null },
33212 .src_constraints = .{ .{ .exact_int = 32 }, .any, .any },
33213 .patterns = &.{
33214 .{ .src = .{ .to_sse, .none, .none } },
33215 },
33216 .extra_temps = .{
33217 .{ .type = .vector_16_u8, .kind = .forward_bits },
33218 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword } } },
33219 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33220 .unused,
33221 .unused,
33222 .unused,
33223 .unused,
33224 .unused,
33225 .unused,
33226 .unused,
33227 .unused,
33228 },
33229 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
33230 .each = .{ .once = &.{
33231 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33232 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
33233 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33234 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
33235 } },
33236 }, .{
33237 .required_features = .{ .ssse3, .gfni, null, null },
33238 .src_constraints = .{ .{ .exact_int = 32 }, .any, .any },
33239 .patterns = &.{
33240 .{ .src = .{ .to_mut_sse, .none, .none } },
33241 },
33242 .extra_temps = .{
33243 .{ .type = .vector_16_u8, .kind = .forward_bits },
33244 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword } } },
33245 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33246 .unused,
33247 .unused,
33248 .unused,
33249 .unused,
33250 .unused,
33251 .unused,
33252 .unused,
33253 .unused,
33254 },
33255 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33256 .each = .{ .once = &.{
33257 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33258 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
33259 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33260 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
33261 } },
33262 }, .{
33263 .required_features = .{ .gfni, null, null, null },
33264 .src_constraints = .{ .{ .exact_int = 32 }, .any, .any },
33265 .patterns = &.{
33266 .{ .src = .{ .to_mut_sse, .none, .none } },
33267 },
33268 .extra_temps = .{
33269 .{ .type = .vector_16_u8, .kind = .forward_bits },
33270 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33271 .unused,
33272 .unused,
33273 .unused,
33274 .unused,
33275 .unused,
33276 .unused,
33277 .unused,
33278 .unused,
33279 .unused,
33280 },
33281 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33282 .each = .{ .once = &.{
33283 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
33284 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp1x), .ui(0), ._ },
33285 .{ ._, .p_, .unpcklwd, .dst0x, .dst0x, ._, ._ },
33286 .{ ._, .p_dq, .srl, .dst0x, .ui(1), ._, ._ },
33287 .{ ._, .p_w, .shufl, .dst0x, .dst0x, .ui(0b00_10_00_10), ._ },
33288 } },
33289 }, .{
33290 .required_features = .{ .avx2, null, null, null },
33291 .src_constraints = .{ .{ .exact_int = 32 }, .any, .any },
33292 .patterns = &.{
33293 .{ .src = .{ .to_sse, .none, .none } },
33294 },
33295 .extra_temps = .{
33296 .{ .type = .vector_32_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword, .smear = 8 } } },
33297 .{ .type = .vector_32_u8, .kind = .reverse_bits },
33298 .{ .type = .vector_32_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
33299 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
33300 .unused,
33301 .unused,
33302 .unused,
33303 .unused,
33304 .unused,
33305 .unused,
33306 .unused,
33307 },
33308 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33309 .each = .{ .once = &.{
33310 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33311 .{ ._, .vp_d, .broadcast, .tmp2y, .src0x, ._, ._ },
33312 .{ ._, .vp_b, .shuf, .tmp2y, .tmp2y, .lea(.dst0y), ._ },
33313 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
33314 .{ ._, .v_dqa, .mov, .tmp3y, .lea(.dst0y), ._, ._ },
33315 .{ ._, .vp_, .@"and", .tmp2y, .tmp2y, .tmp3y, ._ },
33316 .{ ._, .vp_b, .cmpeq, .tmp2y, .tmp2y, .tmp3y, ._ },
33317 .{ ._, .vp_b, .movmsk, .dst0d, .tmp2y, ._, ._ },
33318 } },
33319 }, .{
33320 .src_constraints = .{ .{ .exact_int = 32 }, .any, .any },
33321 .patterns = &.{
33322 .{ .src = .{ .to_mut_gpr, .none, .none } },
33323 },
33324 .extra_temps = .{
33325 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
33326 .unused,
33327 .unused,
33328 .unused,
33329 .unused,
33330 .unused,
33331 .unused,
33332 .unused,
33333 .unused,
33334 .unused,
33335 .unused,
33336 },
33337 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33338 .clobbers = .{ .eflags = true },
33339 .each = .{ .once = &.{
33340 .{ ._, ._, .bswap, .src0d, ._, ._, ._ },
33341 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
33342 .{ ._, ._r, .sh, .src0d, .ui(4), ._, ._ },
33343 .{ ._, ._l, .sh, .tmp0d, .ui(4), ._, ._ },
33344 .{ ._, ._, .@"and", .src0d, .ui(0b00001111000011110000111100001111), ._, ._ },
33345 .{ ._, ._, .@"and", .tmp0d, .ui(0b11110000111100001111000011110000), ._, ._ },
33346 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33347 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33348 .{ ._, ._r, .sh, .dst0d, .ui(2), ._, ._ },
33349 .{ ._, ._l, .sh, .tmp0d, .ui(2), ._, ._ },
33350 .{ ._, ._, .@"and", .dst0d, .ui(0b00110011001100110011001100110011), ._, ._ },
33351 .{ ._, ._, .@"and", .tmp0d, .ui(0b11001100110011001100110011001100), ._, ._ },
33352 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33353 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33354 .{ ._, ._r, .sh, .dst0d, .ui(1), ._, ._ },
33355 .{ ._, ._l, .sh, .tmp0d, .ui(1), ._, ._ },
33356 .{ ._, ._, .@"and", .dst0d, .ui(0b01010101010101010101010101010101), ._, ._ },
33357 .{ ._, ._, .@"and", .tmp0d, .ui(0b10101010101010101010101010101010), ._, ._ },
33358 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33359 } },
33360 }, .{
33361 .required_features = .{ .avx, .gfni, null, null },
33362 .src_constraints = .{ .{ .signed_int = .dword }, .any, .any },
33363 .patterns = &.{
33364 .{ .src = .{ .to_sse, .none, .none } },
33365 },
33366 .extra_temps = .{
33367 .{ .type = .vector_16_u8, .kind = .forward_bits },
33368 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword } } },
33369 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33370 .unused,
33371 .unused,
33372 .unused,
33373 .unused,
33374 .unused,
33375 .unused,
33376 .unused,
33377 .unused,
33378 },
33379 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
33380 .each = .{ .once = &.{
33381 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33382 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
33383 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33384 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
33385 .{ ._, .vp_d, .sra, .dst0x, .dst0x, .uia(32, .dst0, .sub_bit_size), ._ },
33386 } },
33387 }, .{
33388 .required_features = .{ .ssse3, .gfni, null, null },
33389 .src_constraints = .{ .{ .signed_int = .dword }, .any, .any },
33390 .patterns = &.{
33391 .{ .src = .{ .to_mut_sse, .none, .none } },
33392 },
33393 .extra_temps = .{
33394 .{ .type = .vector_16_u8, .kind = .forward_bits },
33395 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword } } },
33396 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33397 .unused,
33398 .unused,
33399 .unused,
33400 .unused,
33401 .unused,
33402 .unused,
33403 .unused,
33404 .unused,
33405 },
33406 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33407 .each = .{ .once = &.{
33408 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33409 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
33410 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33411 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
33412 .{ ._, .p_d, .sra, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33413 } },
33414 }, .{
33415 .required_features = .{ .gfni, null, null, null },
33416 .src_constraints = .{ .{ .signed_int = .dword }, .any, .any },
33417 .patterns = &.{
33418 .{ .src = .{ .to_mut_sse, .none, .none } },
33419 },
33420 .extra_temps = .{
33421 .{ .type = .vector_16_u8, .kind = .forward_bits },
33422 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33423 .unused,
33424 .unused,
33425 .unused,
33426 .unused,
33427 .unused,
33428 .unused,
33429 .unused,
33430 .unused,
33431 .unused,
33432 },
33433 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33434 .each = .{ .once = &.{
33435 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
33436 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp1x), .ui(0), ._ },
33437 .{ ._, .p_, .unpcklwd, .dst0x, .dst0x, ._, ._ },
33438 .{ ._, .p_dq, .srl, .dst0x, .ui(1), ._, ._ },
33439 .{ ._, .p_w, .shufl, .dst0x, .dst0x, .ui(0b00_10_00_10), ._ },
33440 .{ ._, .p_d, .sra, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33441 } },
33442 }, .{
33443 .required_features = .{ .avx2, null, null, null },
33444 .src_constraints = .{ .{ .signed_int = .dword }, .any, .any },
33445 .patterns = &.{
33446 .{ .src = .{ .to_sse, .none, .none } },
33447 },
33448 .extra_temps = .{
33449 .{ .type = .vector_32_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword, .smear = 8 } } },
33450 .{ .type = .vector_32_u8, .kind = .reverse_bits },
33451 .{ .type = .vector_32_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
33452 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
33453 .unused,
33454 .unused,
33455 .unused,
33456 .unused,
33457 .unused,
33458 .unused,
33459 .unused,
33460 },
33461 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33462 .clobbers = .{ .eflags = true },
33463 .each = .{ .once = &.{
33464 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33465 .{ ._, .vp_d, .broadcast, .tmp2y, .src0x, ._, ._ },
33466 .{ ._, .vp_b, .shuf, .tmp2y, .tmp2y, .lea(.dst0y), ._ },
33467 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
33468 .{ ._, .v_dqa, .mov, .tmp3y, .lea(.dst0y), ._, ._ },
33469 .{ ._, .vp_, .@"and", .tmp2y, .tmp2y, .tmp3y, ._ },
33470 .{ ._, .vp_b, .cmpeq, .tmp2y, .tmp2y, .tmp3y, ._ },
33471 .{ ._, .vp_b, .movmsk, .dst0d, .tmp2y, ._, ._ },
33472 .{ ._, ._r, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33473 } },
33474 }, .{
33475 .src_constraints = .{ .{ .signed_int = .dword }, .any, .any },
33476 .patterns = &.{
33477 .{ .src = .{ .to_mut_gpr, .none, .none } },
33478 },
33479 .extra_temps = .{
33480 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
33481 .unused,
33482 .unused,
33483 .unused,
33484 .unused,
33485 .unused,
33486 .unused,
33487 .unused,
33488 .unused,
33489 .unused,
33490 .unused,
33491 },
33492 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33493 .clobbers = .{ .eflags = true },
33494 .each = .{ .once = &.{
33495 .{ ._, ._, .bswap, .src0d, ._, ._, ._ },
33496 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
33497 .{ ._, ._r, .sh, .src0d, .ui(4), ._, ._ },
33498 .{ ._, ._l, .sh, .tmp0d, .ui(4), ._, ._ },
33499 .{ ._, ._, .@"and", .src0d, .ui(0b00001111000011110000111100001111), ._, ._ },
33500 .{ ._, ._, .@"and", .tmp0d, .ui(0b11110000111100001111000011110000), ._, ._ },
33501 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33502 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33503 .{ ._, ._r, .sh, .dst0d, .ui(2), ._, ._ },
33504 .{ ._, ._l, .sh, .tmp0d, .ui(2), ._, ._ },
33505 .{ ._, ._, .@"and", .dst0d, .ui(0b00110011001100110011001100110011), ._, ._ },
33506 .{ ._, ._, .@"and", .tmp0d, .ui(0b11001100110011001100110011001100), ._, ._ },
33507 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33508 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33509 .{ ._, ._r, .sh, .dst0d, .ui(1), ._, ._ },
33510 .{ ._, ._l, .sh, .tmp0d, .ui(1), ._, ._ },
33511 .{ ._, ._, .@"and", .dst0d, .ui(0b01010101010101010101010101010101), ._, ._ },
33512 .{ ._, ._, .@"and", .tmp0d, .ui(0b10101010101010101010101010101010), ._, ._ },
33513 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33514 .{ ._, ._r, .sa, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33515 } },
33516 }, .{
33517 .required_features = .{ .avx, .gfni, null, null },
33518 .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any },
33519 .patterns = &.{
33520 .{ .src = .{ .to_sse, .none, .none } },
33521 },
33522 .extra_temps = .{
33523 .{ .type = .vector_16_u8, .kind = .forward_bits },
33524 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword } } },
33525 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33526 .unused,
33527 .unused,
33528 .unused,
33529 .unused,
33530 .unused,
33531 .unused,
33532 .unused,
33533 .unused,
33534 },
33535 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
33536 .each = .{ .once = &.{
33537 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33538 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
33539 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33540 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
33541 .{ ._, .vp_d, .srl, .dst0x, .dst0x, .uia(32, .dst0, .sub_bit_size), ._ },
33542 } },
33543 }, .{
33544 .required_features = .{ .ssse3, .gfni, null, null },
33545 .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any },
33546 .patterns = &.{
33547 .{ .src = .{ .to_mut_sse, .none, .none } },
33548 },
33549 .extra_temps = .{
33550 .{ .type = .vector_16_u8, .kind = .forward_bits },
33551 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword } } },
33552 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33553 .unused,
33554 .unused,
33555 .unused,
33556 .unused,
33557 .unused,
33558 .unused,
33559 .unused,
33560 .unused,
33561 },
33562 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33563 .each = .{ .once = &.{
33564 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33565 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
33566 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33567 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
33568 .{ ._, .p_d, .srl, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33569 } },
33570 }, .{
33571 .required_features = .{ .gfni, null, null, null },
33572 .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any },
33573 .patterns = &.{
33574 .{ .src = .{ .to_mut_sse, .none, .none } },
33575 },
33576 .extra_temps = .{
33577 .{ .type = .vector_16_u8, .kind = .forward_bits },
33578 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33579 .unused,
33580 .unused,
33581 .unused,
33582 .unused,
33583 .unused,
33584 .unused,
33585 .unused,
33586 .unused,
33587 .unused,
33588 },
33589 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33590 .each = .{ .once = &.{
33591 .{ ._, ._, .lea, .tmp1p, .mem(.tmp0), ._, ._ },
33592 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp1x), .ui(0), ._ },
33593 .{ ._, .p_, .unpcklwd, .dst0x, .dst0x, ._, ._ },
33594 .{ ._, .p_dq, .srl, .dst0x, .ui(1), ._, ._ },
33595 .{ ._, .p_w, .shufl, .dst0x, .dst0x, .ui(0b00_10_00_10), ._ },
33596 .{ ._, .p_d, .srl, .dst0x, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33597 } },
33598 }, .{
33599 .required_features = .{ .avx2, null, null, null },
33600 .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any },
33601 .patterns = &.{
33602 .{ .src = .{ .to_sse, .none, .none } },
33603 },
33604 .extra_temps = .{
33605 .{ .type = .vector_32_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .dword, .smear = 8 } } },
33606 .{ .type = .vector_32_u8, .kind = .reverse_bits },
33607 .{ .type = .vector_32_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
33608 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
33609 .unused,
33610 .unused,
33611 .unused,
33612 .unused,
33613 .unused,
33614 .unused,
33615 .unused,
33616 },
33617 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33618 .clobbers = .{ .eflags = true },
33619 .each = .{ .once = &.{
33620 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33621 .{ ._, .vp_d, .broadcast, .tmp2y, .src0x, ._, ._ },
33622 .{ ._, .vp_b, .shuf, .tmp2y, .tmp2y, .lea(.dst0y), ._ },
33623 .{ ._, ._, .lea, .dst0p, .mem(.tmp1), ._, ._ },
33624 .{ ._, .v_dqa, .mov, .tmp3y, .lea(.dst0y), ._, ._ },
33625 .{ ._, .vp_, .@"and", .tmp2y, .tmp2y, .tmp3y, ._ },
33626 .{ ._, .vp_b, .cmpeq, .tmp2y, .tmp2y, .tmp3y, ._ },
33627 .{ ._, .vp_b, .movmsk, .dst0d, .tmp2y, ._, ._ },
33628 .{ ._, ._r, .sh, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33629 } },
33630 }, .{
33631 .src_constraints = .{ .{ .unsigned_int = .dword }, .any, .any },
33632 .patterns = &.{
33633 .{ .src = .{ .to_mut_gpr, .none, .none } },
33634 },
33635 .extra_temps = .{
33636 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
33637 .unused,
33638 .unused,
33639 .unused,
33640 .unused,
33641 .unused,
33642 .unused,
33643 .unused,
33644 .unused,
33645 .unused,
33646 .unused,
33647 },
33648 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33649 .clobbers = .{ .eflags = true },
33650 .each = .{ .once = &.{
33651 .{ ._, ._, .bswap, .src0d, ._, ._, ._ },
33652 .{ ._, ._, .mov, .tmp0d, .src0d, ._, ._ },
33653 .{ ._, ._r, .sh, .src0d, .ui(4), ._, ._ },
33654 .{ ._, ._l, .sh, .tmp0d, .ui(4), ._, ._ },
33655 .{ ._, ._, .@"and", .src0d, .ui(0b00001111000011110000111100001111), ._, ._ },
33656 .{ ._, ._, .@"and", .tmp0d, .ui(0b11110000111100001111000011110000), ._, ._ },
33657 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33658 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33659 .{ ._, ._r, .sh, .dst0d, .ui(2), ._, ._ },
33660 .{ ._, ._l, .sh, .tmp0d, .ui(2), ._, ._ },
33661 .{ ._, ._, .@"and", .dst0d, .ui(0b00110011001100110011001100110011), ._, ._ },
33662 .{ ._, ._, .@"and", .tmp0d, .ui(0b11001100110011001100110011001100), ._, ._ },
33663 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33664 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
33665 .{ ._, ._r, .sh, .dst0d, .ui(1), ._, ._ },
33666 .{ ._, ._l, .sh, .tmp0d, .ui(1), ._, ._ },
33667 .{ ._, ._, .@"and", .dst0d, .ui(0b01010101010101010101010101010101), ._, ._ },
33668 .{ ._, ._, .@"and", .tmp0d, .ui(0b10101010101010101010101010101010), ._, ._ },
33669 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
33670 .{ ._, ._r, .sh, .dst0d, .uia(32, .dst0, .sub_bit_size), ._, ._ },
33671 } },
33672 }, .{
33673 .required_features = .{ .avx, .gfni, null, null },
33674 .src_constraints = .{ .{ .exact_int = 64 }, .any, .any },
33675 .patterns = &.{
33676 .{ .src = .{ .to_sse, .none, .none } },
33677 },
33678 .extra_temps = .{
33679 .{ .type = .vector_16_u8, .kind = .forward_bits },
33680 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .qword } } },
33681 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33682 .unused,
33683 .unused,
33684 .unused,
33685 .unused,
33686 .unused,
33687 .unused,
33688 .unused,
33689 .unused,
33690 },
33691 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
33692 .each = .{ .once = &.{
33693 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33694 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
33695 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33696 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
33697 } },
33698 }, .{
33699 .required_features = .{ .ssse3, .gfni, null, null },
33700 .src_constraints = .{ .{ .exact_int = 64 }, .any, .any },
33701 .patterns = &.{
33702 .{ .src = .{ .to_mut_sse, .none, .none } },
33703 },
33704 .extra_temps = .{
33705 .{ .type = .vector_16_u8, .kind = .forward_bits },
33706 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .qword } } },
33707 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33708 .unused,
33709 .unused,
33710 .unused,
33711 .unused,
33712 .unused,
33713 .unused,
33714 .unused,
33715 .unused,
33716 },
33717 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33718 .each = .{ .once = &.{
33719 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33720 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
33721 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33722 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
33723 } },
33724 }, .{
33725 .required_features = .{ .@"64bit", .gfni, null, null },
33726 .src_constraints = .{ .{ .exact_int = 64 }, .any, .any },
33727 .patterns = &.{
33728 .{ .src = .{ .to_mut_sse, .none, .none } },
33729 },
33730 .extra_temps = .{
33731 .{ .type = .vector_16_u8, .kind = .forward_bits },
33732 .unused,
33733 .unused,
33734 .unused,
33735 .unused,
33736 .unused,
33737 .unused,
33738 .unused,
33739 .unused,
33740 .unused,
33741 .unused,
33742 },
33743 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33744 .each = .{ .once = &.{
33745 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33746 .{ ._, ._b, .gf2p8affineq, .src0x, .lea(.dst0x), .ui(0), ._ },
33747 .{ ._, ._q, .mov, .dst0q, .src0x, ._, ._ },
33748 .{ ._, ._, .bswap, .dst0q, ._, ._, ._ },
33749 } },
33750 }, .{
33751 .required_features = .{ .@"64bit", null, null, null },
33752 .src_constraints = .{ .{ .exact_int = 64 }, .any, .any },
33753 .patterns = &.{
33754 .{ .src = .{ .to_mut_gpr, .none, .none } },
33755 },
33756 .extra_temps = .{
33757 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33758 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33759 .unused,
33760 .unused,
33761 .unused,
33762 .unused,
33763 .unused,
33764 .unused,
33765 .unused,
33766 .unused,
33767 .unused,
33768 },
33769 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33770 .clobbers = .{ .eflags = true },
33771 .each = .{ .once = &.{
33772 .{ ._, ._, .bswap, .src0q, ._, ._, ._ },
33773 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
33774 .{ ._, ._, .mov, .tmp1q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
33775 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33776 .{ ._, ._r, .sh, .src0q, .ui(4), ._, ._ },
33777 .{ ._, ._l, .sh, .tmp0q, .ui(4), ._, ._ },
33778 .{ ._, ._, .@"and", .src0q, .tmp1q, ._, ._ },
33779 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
33780 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
33781 .{ ._, ._, .mov, .tmp1q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
33782 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33783 .{ ._, ._r, .sh, .dst0q, .ui(2), ._, ._ },
33784 .{ ._, ._l, .sh, .tmp0q, .ui(2), ._, ._ },
33785 .{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
33786 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
33787 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
33788 .{ ._, ._, .mov, .tmp1q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
33789 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33790 .{ ._, ._r, .sh, .dst0q, .ui(1), ._, ._ },
33791 .{ ._, ._l, .sh, .tmp0q, .ui(1), ._, ._ },
33792 .{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
33793 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
33794 } },
33795 }, .{
33796 .required_features = .{ .@"64bit", .avx, .gfni, null },
33797 .src_constraints = .{ .{ .signed_int = .qword }, .any, .any },
33798 .patterns = &.{
33799 .{ .src = .{ .to_sse, .none, .none } },
33800 },
33801 .extra_temps = .{
33802 .{ .type = .vector_16_u8, .kind = .forward_bits },
33803 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
33804 .unused,
33805 .unused,
33806 .unused,
33807 .unused,
33808 .unused,
33809 .unused,
33810 .unused,
33811 .unused,
33812 .unused,
33813 },
33814 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33815 .clobbers = .{ .eflags = true },
33816 .each = .{ .once = &.{
33817 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33818 .{ ._, .v_b, .gf2p8affineq, .tmp1x, .src0x, .lea(.dst0x), .ui(0) },
33819 .{ ._, .v_q, .mov, .dst0q, .tmp1x, ._, ._ },
33820 .{ ._, ._, .bswap, .dst0q, ._, ._, ._ },
33821 .{ ._, ._r, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ },
33822 } },
33823 }, .{
33824 .required_features = .{ .@"64bit", .gfni, null, null },
33825 .src_constraints = .{ .{ .signed_int = .qword }, .any, .any },
33826 .patterns = &.{
33827 .{ .src = .{ .to_mut_sse, .none, .none } },
33828 },
33829 .extra_temps = .{
33830 .{ .type = .vector_16_u8, .kind = .forward_bits },
33831 .unused,
33832 .unused,
33833 .unused,
33834 .unused,
33835 .unused,
33836 .unused,
33837 .unused,
33838 .unused,
33839 .unused,
33840 .unused,
33841 },
33842 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33843 .clobbers = .{ .eflags = true },
33844 .each = .{ .once = &.{
33845 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33846 .{ ._, ._b, .gf2p8affineq, .src0x, .lea(.dst0x), .ui(0), ._ },
33847 .{ ._, ._q, .mov, .dst0q, .src0x, ._, ._ },
33848 .{ ._, ._, .bswap, .dst0q, ._, ._, ._ },
33849 .{ ._, ._r, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ },
33850 } },
33851 }, .{
33852 .required_features = .{ .@"64bit", null, null, null },
33853 .src_constraints = .{ .{ .signed_int = .qword }, .any, .any },
33854 .patterns = &.{
33855 .{ .src = .{ .to_mut_gpr, .none, .none } },
33856 },
33857 .extra_temps = .{
33858 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33859 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33860 .unused,
33861 .unused,
33862 .unused,
33863 .unused,
33864 .unused,
33865 .unused,
33866 .unused,
33867 .unused,
33868 .unused,
33869 },
33870 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33871 .clobbers = .{ .eflags = true },
33872 .each = .{ .once = &.{
33873 .{ ._, ._, .bswap, .src0q, ._, ._, ._ },
33874 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
33875 .{ ._, ._, .mov, .tmp1q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
33876 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33877 .{ ._, ._r, .sh, .src0q, .ui(4), ._, ._ },
33878 .{ ._, ._l, .sh, .tmp0q, .ui(4), ._, ._ },
33879 .{ ._, ._, .@"and", .src0q, .tmp1q, ._, ._ },
33880 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
33881 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
33882 .{ ._, ._, .mov, .tmp1q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
33883 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33884 .{ ._, ._r, .sh, .dst0q, .ui(2), ._, ._ },
33885 .{ ._, ._l, .sh, .tmp0q, .ui(2), ._, ._ },
33886 .{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
33887 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
33888 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
33889 .{ ._, ._, .mov, .tmp1q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
33890 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
33891 .{ ._, ._r, .sh, .dst0q, .ui(1), ._, ._ },
33892 .{ ._, ._l, .sh, .tmp0q, .ui(1), ._, ._ },
33893 .{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
33894 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
33895 .{ ._, ._r, .sa, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ },
33896 } },
33897 }, .{
33898 .required_features = .{ .avx, .gfni, null, null },
33899 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
33900 .patterns = &.{
33901 .{ .src = .{ .to_sse, .none, .none } },
33902 },
33903 .extra_temps = .{
33904 .{ .type = .vector_16_u8, .kind = .forward_bits },
33905 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .qword } } },
33906 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33907 .unused,
33908 .unused,
33909 .unused,
33910 .unused,
33911 .unused,
33912 .unused,
33913 .unused,
33914 .unused,
33915 },
33916 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
33917 .each = .{ .once = &.{
33918 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33919 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
33920 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33921 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
33922 .{ ._, .vp_q, .srl, .dst0x, .dst0x, .uia(64, .dst0, .sub_bit_size), ._ },
33923 } },
33924 }, .{
33925 .required_features = .{ .ssse3, .gfni, null, null },
33926 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
33927 .patterns = &.{
33928 .{ .src = .{ .to_mut_sse, .none, .none } },
33929 },
33930 .extra_temps = .{
33931 .{ .type = .vector_16_u8, .kind = .forward_bits },
33932 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .qword } } },
33933 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
33934 .unused,
33935 .unused,
33936 .unused,
33937 .unused,
33938 .unused,
33939 .unused,
33940 .unused,
33941 .unused,
33942 },
33943 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33944 .each = .{ .once = &.{
33945 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
33946 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
33947 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
33948 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
33949 .{ ._, .p_q, .srl, .dst0x, .uia(64, .dst0, .sub_bit_size), ._, ._ },
33950 } },
33951 }, .{
33952 .required_features = .{ .@"64bit", .gfni, null, null },
33953 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
33954 .patterns = &.{
33955 .{ .src = .{ .to_mut_sse, .none, .none } },
33956 },
33957 .extra_temps = .{
33958 .{ .type = .vector_16_u8, .kind = .forward_bits },
33959 .unused,
33960 .unused,
33961 .unused,
33962 .unused,
33963 .unused,
33964 .unused,
33965 .unused,
33966 .unused,
33967 .unused,
33968 .unused,
33969 },
33970 .dst_temps = .{ .{ .rc = .general_purpose }, .unused },
33971 .clobbers = .{ .eflags = true },
33972 .each = .{ .once = &.{
33973 .{ ._, ._, .lea, .dst0p, .mem(.tmp0), ._, ._ },
33974 .{ ._, ._b, .gf2p8affineq, .src0x, .lea(.dst0x), .ui(0), ._ },
33975 .{ ._, ._q, .mov, .dst0q, .src0x, ._, ._ },
33976 .{ ._, ._, .bswap, .dst0q, ._, ._, ._ },
33977 .{ ._, ._r, .sh, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ },
33978 } },
33979 }, .{
33980 .required_features = .{ .@"64bit", null, null, null },
33981 .src_constraints = .{ .{ .unsigned_int = .qword }, .any, .any },
33982 .patterns = &.{
33983 .{ .src = .{ .to_mut_gpr, .none, .none } },
33984 },
33985 .extra_temps = .{
33986 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33987 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
33988 .unused,
33989 .unused,
33990 .unused,
33991 .unused,
33992 .unused,
33993 .unused,
33994 .unused,
33995 .unused,
33996 .unused,
33997 },
33998 .dst_temps = .{ .{ .ref = .src0 }, .unused },
33999 .clobbers = .{ .eflags = true },
34000 .each = .{ .once = &.{
34001 .{ ._, ._, .bswap, .src0q, ._, ._, ._ },
34002 .{ ._, ._, .mov, .tmp0q, .src0q, ._, ._ },
34003 .{ ._, ._, .mov, .tmp1q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34004 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
34005 .{ ._, ._r, .sh, .src0q, .ui(4), ._, ._ },
34006 .{ ._, ._l, .sh, .tmp0q, .ui(4), ._, ._ },
34007 .{ ._, ._, .@"and", .src0q, .tmp1q, ._, ._ },
34008 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
34009 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
34010 .{ ._, ._, .mov, .tmp1q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34011 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
34012 .{ ._, ._r, .sh, .dst0q, .ui(2), ._, ._ },
34013 .{ ._, ._l, .sh, .tmp0q, .ui(2), ._, ._ },
34014 .{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
34015 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
34016 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
34017 .{ ._, ._, .mov, .tmp1q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34018 .{ ._, ._, .@"and", .tmp0q, .tmp1q, ._, ._ },
34019 .{ ._, ._r, .sh, .dst0q, .ui(1), ._, ._ },
34020 .{ ._, ._l, .sh, .tmp0q, .ui(1), ._, ._ },
34021 .{ ._, ._, .@"and", .dst0q, .tmp1q, ._, ._ },
34022 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
34023 .{ ._, ._r, .sh, .dst0q, .uia(64, .dst0, .sub_bit_size), ._, ._ },
34024 } },
34025 }, .{
34026 .required_features = .{ .avx, .gfni, null, null },
34027 .src_constraints = .{ .{ .exact_int = 128 }, .any, .any },
34028 .patterns = &.{
34029 .{ .src = .{ .to_sse, .none, .none } },
34030 },
34031 .extra_temps = .{
34032 .{ .type = .vector_16_u8, .kind = .forward_bits },
34033 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .xword } } },
34034 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34035 .unused,
34036 .unused,
34037 .unused,
34038 .unused,
34039 .unused,
34040 .unused,
34041 .unused,
34042 .unused,
34043 },
34044 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
34045 .each = .{ .once = &.{
34046 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34047 .{ ._, .v_b, .gf2p8affineq, .dst0x, .src0x, .lea(.tmp2x), .ui(0) },
34048 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34049 .{ ._, .vp_b, .shuf, .dst0x, .dst0x, .lea(.tmp2x), ._ },
34050 } },
34051 }, .{
34052 .required_features = .{ .ssse3, .gfni, null, null },
34053 .src_constraints = .{ .{ .exact_int = 128 }, .any, .any },
34054 .patterns = &.{
34055 .{ .src = .{ .to_mut_sse, .none, .none } },
34056 },
34057 .extra_temps = .{
34058 .{ .type = .vector_16_u8, .kind = .forward_bits },
34059 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .xword } } },
34060 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34061 .unused,
34062 .unused,
34063 .unused,
34064 .unused,
34065 .unused,
34066 .unused,
34067 .unused,
34068 .unused,
34069 },
34070 .dst_temps = .{ .{ .ref = .src0 }, .unused },
34071 .each = .{ .once = &.{
34072 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34073 .{ ._, ._b, .gf2p8affineq, .dst0x, .lea(.tmp2x), .ui(0), ._ },
34074 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34075 .{ ._, .p_b, .shuf, .dst0x, .lea(.tmp2x), ._, ._ },
34076 } },
34077 }, .{
34078 .required_features = .{ .@"64bit", .avx, .gfni, null },
34079 .src_constraints = .{ .{ .signed_int = .xword }, .any, .any },
34080 .patterns = &.{
34081 .{ .src = .{ .to_sse, .none, .none } },
34082 },
34083 .extra_temps = .{
34084 .{ .type = .vector_16_u8, .kind = .forward_bits },
34085 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .xword } } },
34086 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34087 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
34088 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34089 .unused,
34090 .unused,
34091 .unused,
34092 .unused,
34093 .unused,
34094 .unused,
34095 },
34096 .dst_temps = .{ .mem, .unused },
34097 .clobbers = .{ .eflags = true },
34098 .each = .{ .once = &.{
34099 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34100 .{ ._, .v_b, .gf2p8affineq, .tmp3x, .src0x, .lea(.tmp2x), .ui(0) },
34101 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34102 .{ ._, .vp_b, .shuf, .tmp3x, .tmp3x, .lea(.tmp2x), ._ },
34103 .{ ._, .v_q, .mov, .tmp2q, .tmp3x, ._, ._ },
34104 .{ ._, .vp_q, .extr, .tmp4q, .tmp3x, .ui(1), ._ },
34105 .{ ._, ._rd, .sh, .tmp2q, .tmp4q, .uia(128, .dst0, .sub_bit_size), ._ },
34106 .{ ._, ._, .mov, .dst0q, .tmp2q, ._, ._ },
34107 .{ ._, ._r, .sa, .tmp4q, .uia(128, .dst0, .sub_bit_size), ._, ._ },
34108 .{ ._, ._, .mov, .memd(.dst0q, 8), .tmp4q, ._, ._ },
34109 } },
34110 }, .{
34111 .required_features = .{ .@"64bit", .ssse3, .gfni, null },
34112 .src_constraints = .{ .{ .signed_int = .xword }, .any, .any },
34113 .patterns = &.{
34114 .{ .src = .{ .to_mut_sse, .none, .none } },
34115 },
34116 .extra_temps = .{
34117 .{ .type = .vector_16_u8, .kind = .forward_bits },
34118 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .xword } } },
34119 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34120 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34121 .unused,
34122 .unused,
34123 .unused,
34124 .unused,
34125 .unused,
34126 .unused,
34127 .unused,
34128 },
34129 .dst_temps = .{ .mem, .unused },
34130 .clobbers = .{ .eflags = true },
34131 .each = .{ .once = &.{
34132 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34133 .{ ._, ._b, .gf2p8affineq, .src0x, .lea(.tmp2x), .ui(0), ._ },
34134 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34135 .{ ._, .p_b, .shuf, .src0x, .lea(.tmp2x), ._, ._ },
34136 .{ ._, ._q, .mov, .tmp2q, .src0x, ._, ._ },
34137 .{ ._, .p_q, .extr, .tmp3q, .src0x, .ui(1), ._ },
34138 .{ ._, ._rd, .sh, .tmp2q, .tmp3q, .uia(128, .dst0, .sub_bit_size), ._ },
34139 .{ ._, ._, .mov, .dst0q, .tmp2q, ._, ._ },
34140 .{ ._, ._r, .sa, .tmp3q, .uia(128, .dst0, .sub_bit_size), ._, ._ },
34141 .{ ._, ._, .mov, .memd(.dst0q, 8), .tmp3q, ._, ._ },
34142 } },
34143 }, .{
34144 .required_features = .{ .@"64bit", .avx, .gfni, null },
34145 .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },
34146 .patterns = &.{
34147 .{ .src = .{ .to_sse, .none, .none } },
34148 },
34149 .extra_temps = .{
34150 .{ .type = .vector_16_u8, .kind = .forward_bits },
34151 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .xword } } },
34152 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34153 .{ .type = .vector_16_u8, .kind = .{ .mut_rc = .{ .ref = .src0, .rc = .sse } } },
34154 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34155 .unused,
34156 .unused,
34157 .unused,
34158 .unused,
34159 .unused,
34160 .unused,
34161 },
34162 .dst_temps = .{ .mem, .unused },
34163 .clobbers = .{ .eflags = true },
34164 .each = .{ .once = &.{
34165 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34166 .{ ._, .v_b, .gf2p8affineq, .tmp3x, .src0x, .lea(.tmp2x), .ui(0) },
34167 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34168 .{ ._, .vp_b, .shuf, .tmp3x, .tmp3x, .lea(.tmp2x), ._ },
34169 .{ ._, .v_q, .mov, .tmp2q, .tmp3x, ._, ._ },
34170 .{ ._, .vp_q, .extr, .tmp4q, .tmp3x, .ui(1), ._ },
34171 .{ ._, ._rd, .sh, .tmp2q, .tmp4q, .uia(128, .dst0, .sub_bit_size), ._ },
34172 .{ ._, ._, .mov, .dst0q, .tmp2q, ._, ._ },
34173 .{ ._, ._r, .sh, .tmp4q, .uia(128, .dst0, .sub_bit_size), ._, ._ },
34174 .{ ._, ._, .mov, .memd(.dst0q, 8), .tmp4q, ._, ._ },
34175 } },
34176 }, .{
34177 .required_features = .{ .@"64bit", .ssse3, .gfni, null },
34178 .src_constraints = .{ .{ .unsigned_int = .xword }, .any, .any },
34179 .patterns = &.{
34180 .{ .src = .{ .to_mut_sse, .none, .none } },
34181 },
34182 .extra_temps = .{
34183 .{ .type = .vector_16_u8, .kind = .forward_bits },
34184 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .xword } } },
34185 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34186 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34187 .unused,
34188 .unused,
34189 .unused,
34190 .unused,
34191 .unused,
34192 .unused,
34193 .unused,
34194 },
34195 .dst_temps = .{ .mem, .unused },
34196 .clobbers = .{ .eflags = true },
34197 .each = .{ .once = &.{
34198 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34199 .{ ._, ._b, .gf2p8affineq, .src0x, .lea(.tmp2x), .ui(0), ._ },
34200 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34201 .{ ._, .p_b, .shuf, .src0x, .lea(.tmp2x), ._, ._ },
34202 .{ ._, ._q, .mov, .tmp2q, .src0x, ._, ._ },
34203 .{ ._, .p_q, .extr, .tmp3q, .src0x, .ui(1), ._ },
34204 .{ ._, ._rd, .sh, .tmp2q, .tmp3q, .uia(128, .dst0, .sub_bit_size), ._ },
34205 .{ ._, ._, .mov, .dst0q, .tmp2q, ._, ._ },
34206 .{ ._, ._r, .sh, .tmp3q, .uia(128, .dst0, .sub_bit_size), ._, ._ },
34207 .{ ._, ._, .mov, .memd(.dst0q, 8), .tmp3q, ._, ._ },
34208 } },
34209 }, .{
34210 .required_features = .{ .avx2, .gfni, null, null },
34211 .src_constraints = .{ .{ .exact_int = 256 }, .any, .any },
34212 .patterns = &.{
34213 .{ .src = .{ .to_sse, .none, .none } },
34214 },
34215 .extra_temps = .{
34216 .{ .type = .vector_32_u8, .kind = .forward_bits },
34217 .{ .type = .vector_32_u8, .kind = .{ .pshufb_bswap_mem = .{ .repeat = 2, .size = .xword } } },
34218 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34219 .unused,
34220 .unused,
34221 .unused,
34222 .unused,
34223 .unused,
34224 .unused,
34225 .unused,
34226 .unused,
34227 },
34228 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
34229 .each = .{ .once = &.{
34230 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34231 .{ ._, .v_b, .gf2p8affineq, .dst0y, .src0y, .lea(.tmp2y), .ui(0) },
34232 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34233 .{ ._, .vp_b, .shuf, .dst0y, .dst0y, .lea(.tmp2y), ._ },
34234 .{ ._, .v_q, .perm, .dst0y, .dst0y, .ui(0b01_00_11_10), ._ },
34235 } },
34236 }, .{
34237 .required_features = .{ .avx, .gfni, null, null },
34238 .src_constraints = .{ .{ .exact_int = 256 }, .any, .any },
34239 .patterns = &.{
34240 .{ .src = .{ .to_sse, .none, .none } },
34241 },
34242 .extra_temps = .{
34243 .{ .type = .vector_32_u8, .kind = .forward_bits },
34244 .{ .type = .vector_32_u8, .kind = .{ .pshufb_bswap_mem = .{ .repeat = 2, .size = .xword } } },
34245 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34246 .unused,
34247 .unused,
34248 .unused,
34249 .unused,
34250 .unused,
34251 .unused,
34252 .unused,
34253 .unused,
34254 },
34255 .dst_temps = .{ .{ .mut_rc = .{ .ref = .src0, .rc = .sse } }, .unused },
34256 .each = .{ .once = &.{
34257 .{ ._, ._, .lea, .tmp2p, .mem(.tmp0), ._, ._ },
34258 .{ ._, .v_b, .gf2p8affineq, .dst0y, .src0y, .lea(.tmp2y), .ui(0) },
34259 .{ ._, ._, .lea, .tmp2p, .mem(.tmp1), ._, ._ },
34260 .{ ._, .vp_b, .shuf, .dst0y, .dst0y, .lea(.tmp2y), ._ },
34261 .{ ._, .v_pd, .perm, .dst0y, .dst0y, .ui(0b01_00_11_10), ._ },
34262 } },
34263 }, .{
34264 .required_features = .{ .avx2, .gfni, null, null },
34265 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },
34266 .patterns = &.{
34267 .{ .src = .{ .to_mem, .none, .none } },
34268 },
34269 .extra_temps = .{
34270 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34271 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34272 .{ .type = .vector_32_u8, .kind = .forward_bits },
34273 .{ .type = .vector_32_u8, .kind = .{ .pshufb_bswap_mem = .{ .repeat = 2, .size = .xword } } },
34274 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
34275 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
34276 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
34277 .unused,
34278 .unused,
34279 .unused,
34280 .unused,
34281 },
34282 .dst_temps = .{ .mem, .unused },
34283 .clobbers = .{ .eflags = true },
34284 .each = .{ .once = &.{
34285 .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ },
34286 .{ ._, .v_dqa, .mov, .tmp4y, .lea(.tmp0y), ._, ._ },
34287 .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ },
34288 .{ ._, .v_dqa, .mov, .tmp5y, .lea(.tmp0y), ._, ._ },
34289 .{ ._, ._, .mov, .tmp0d, .sia(-32, .dst0, .add_size), ._, ._ },
34290 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34291 .{ .@"0:", .v_q, .perm, .tmp6y, .lea(.tmp1y), .ui(0b01_00_11_10), ._ },
34292 .{ ._, .v_b, .gf2p8affineq, .tmp6y, .tmp6y, .tmp4y, .ui(0) },
34293 .{ ._, .vp_b, .shuf, .tmp6y, .tmp6y, .tmp5y, ._ },
34294 .{ ._, .v_dqu, .mov, .memi(.dst0y, .tmp0), .tmp6y, ._, ._ },
34295 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 32), ._, ._ },
34296 .{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ },
34297 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34298 } },
34299 }, .{
34300 .required_features = .{ .avx, .gfni, null, null },
34301 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .yword, .is = .yword } }, .any, .any },
34302 .patterns = &.{
34303 .{ .src = .{ .to_mem, .none, .none } },
34304 },
34305 .extra_temps = .{
34306 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34307 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34308 .{ .type = .vector_32_u8, .kind = .forward_bits },
34309 .{ .type = .vector_32_u8, .kind = .{ .pshufb_bswap_mem = .{ .repeat = 2, .size = .xword } } },
34310 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
34311 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
34312 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
34313 .unused,
34314 .unused,
34315 .unused,
34316 .unused,
34317 },
34318 .dst_temps = .{ .mem, .unused },
34319 .clobbers = .{ .eflags = true },
34320 .each = .{ .once = &.{
34321 .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ },
34322 .{ ._, .v_dqa, .mov, .tmp4y, .lea(.tmp0y), ._, ._ },
34323 .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ },
34324 .{ ._, .v_dqa, .mov, .tmp5y, .lea(.tmp0y), ._, ._ },
34325 .{ ._, ._, .mov, .tmp0d, .sia(-32, .dst0, .add_size), ._, ._ },
34326 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34327 .{ .@"0:", .v_pd, .perm, .tmp6y, .lea(.tmp1y), .ui(0b01_00_11_10), ._ },
34328 .{ ._, .v_b, .gf2p8affineq, .tmp6y, .tmp6y, .tmp4y, .ui(0) },
34329 .{ ._, .vp_b, .shuf, .tmp6y, .tmp6y, .tmp5y, ._ },
34330 .{ ._, .v_dqu, .mov, .memi(.dst0y, .tmp0), .tmp6y, ._, ._ },
34331 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 32), ._, ._ },
34332 .{ ._, ._, .sub, .tmp0d, .si(32), ._, ._ },
34333 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34334 } },
34335 }, .{
34336 .required_features = .{ .avx, .gfni, null, null },
34337 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
34338 .patterns = &.{
34339 .{ .src = .{ .to_mem, .none, .none } },
34340 },
34341 .extra_temps = .{
34342 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34343 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34344 .{ .type = .vector_16_u8, .kind = .forward_bits },
34345 .{ .type = .vector_16_u8, .kind = .{ .pshufb_bswap_mem = .{ .size = .xword } } },
34346 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
34347 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
34348 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
34349 .unused,
34350 .unused,
34351 .unused,
34352 .unused,
34353 },
34354 .dst_temps = .{ .mem, .unused },
34355 .clobbers = .{ .eflags = true },
34356 .each = .{ .once = &.{
34357 .{ ._, ._, .lea, .tmp0p, .mem(.tmp2), ._, ._ },
34358 .{ ._, .v_dqa, .mov, .tmp4x, .lea(.tmp0x), ._, ._ },
34359 .{ ._, ._, .lea, .tmp0p, .mem(.tmp3), ._, ._ },
34360 .{ ._, .v_dqa, .mov, .tmp5x, .lea(.tmp0x), ._, ._ },
34361 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34362 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34363 .{ .@"0:", .v_dqa, .mov, .tmp6x, .lea(.tmp1x), ._, ._ },
34364 .{ ._, .v_b, .gf2p8affineq, .tmp6x, .tmp6x, .tmp4x, .ui(0) },
34365 .{ ._, .vp_b, .shuf, .tmp6x, .tmp6x, .tmp5x, ._ },
34366 .{ ._, .v_dqa, .mov, .memi(.dst0x, .tmp0), .tmp6x, ._, ._ },
34367 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 16), ._, ._ },
34368 .{ ._, ._, .sub, .tmp0d, .si(16), ._, ._ },
34369 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34370 } },
34371 }, .{
34372 .required_features = .{ .@"64bit", .movbe, null, null },
34373 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
34374 .patterns = &.{
34375 .{ .src = .{ .to_mem, .none, .none } },
34376 },
34377 .extra_temps = .{
34378 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34379 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34380 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34381 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34382 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34383 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34384 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34385 .unused,
34386 .unused,
34387 .unused,
34388 .unused,
34389 },
34390 .dst_temps = .{ .mem, .unused },
34391 .clobbers = .{ .eflags = true },
34392 .each = .{ .once = &.{
34393 .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ },
34394 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34395 .{ ._, ._, .mov, .tmp2q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34396 .{ ._, ._, .mov, .tmp3q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34397 .{ ._, ._, .mov, .tmp4q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34398 .{ .@"0:", ._, .mov, .tmp5q, .lea(.tmp1q), ._, ._ },
34399 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34400 .{ ._, ._, .@"and", .tmp6q, .tmp2q, ._, ._ },
34401 .{ ._, ._r, .sh, .tmp5q, .ui(4), ._, ._ },
34402 .{ ._, ._l, .sh, .tmp6q, .ui(4), ._, ._ },
34403 .{ ._, ._, .@"and", .tmp5q, .tmp2q, ._, ._ },
34404 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34405 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34406 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34407 .{ ._, ._r, .sh, .tmp5q, .ui(2), ._, ._ },
34408 .{ ._, ._l, .sh, .tmp6q, .ui(2), ._, ._ },
34409 .{ ._, ._, .@"and", .tmp5q, .tmp3q, ._, ._ },
34410 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34411 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34412 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34413 .{ ._, ._r, .sh, .tmp5q, .ui(1), ._, ._ },
34414 .{ ._, ._l, .sh, .tmp6q, .ui(1), ._, ._ },
34415 .{ ._, ._, .@"and", .tmp5q, .tmp4q, ._, ._ },
34416 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34417 .{ ._, ._, .movbe, .memi(.dst0q, .tmp0), .tmp5q, ._, ._ },
34418 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34419 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34420 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34421 } },
34422 }, .{
34423 .required_features = .{ .@"64bit", null, null, null },
34424 .src_constraints = .{ .{ .exact_remainder_int = .{ .of = .xword, .is = .xword } }, .any, .any },
34425 .patterns = &.{
34426 .{ .src = .{ .to_mem, .none, .none } },
34427 },
34428 .extra_temps = .{
34429 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34430 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34431 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34432 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34433 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34434 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34435 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34436 .unused,
34437 .unused,
34438 .unused,
34439 .unused,
34440 },
34441 .dst_temps = .{ .mem, .unused },
34442 .clobbers = .{ .eflags = true },
34443 .each = .{ .once = &.{
34444 .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ },
34445 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34446 .{ ._, ._, .mov, .tmp2q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34447 .{ ._, ._, .mov, .tmp3q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34448 .{ ._, ._, .mov, .tmp4q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34449 .{ .@"0:", ._, .mov, .tmp5q, .lea(.tmp1q), ._, ._ },
34450 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34451 .{ ._, ._, .@"and", .tmp6q, .tmp2q, ._, ._ },
34452 .{ ._, ._r, .sh, .tmp5q, .ui(4), ._, ._ },
34453 .{ ._, ._l, .sh, .tmp6q, .ui(4), ._, ._ },
34454 .{ ._, ._, .@"and", .tmp5q, .tmp2q, ._, ._ },
34455 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34456 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34457 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34458 .{ ._, ._r, .sh, .tmp5q, .ui(2), ._, ._ },
34459 .{ ._, ._l, .sh, .tmp6q, .ui(2), ._, ._ },
34460 .{ ._, ._, .@"and", .tmp5q, .tmp3q, ._, ._ },
34461 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34462 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34463 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34464 .{ ._, ._r, .sh, .tmp5q, .ui(1), ._, ._ },
34465 .{ ._, ._l, .sh, .tmp6q, .ui(1), ._, ._ },
34466 .{ ._, ._, .@"and", .tmp5q, .tmp4q, ._, ._ },
34467 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34468 .{ ._, ._, .bswap, .tmp5q, ._, ._, ._ },
34469 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp5q, ._, ._ },
34470 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34471 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34472 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34473 } },
34474 }, .{
34475 .required_features = .{ .@"64bit", .movbe, null, null },
34476 .src_constraints = .{ .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34477 .patterns = &.{
34478 .{ .src = .{ .to_mem, .none, .none } },
34479 },
34480 .extra_temps = .{
34481 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34482 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34483 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34484 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34485 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34486 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34487 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34488 .unused,
34489 .unused,
34490 .unused,
34491 .unused,
34492 },
34493 .dst_temps = .{ .mem, .unused },
34494 .clobbers = .{ .eflags = true },
34495 .each = .{ .once = &.{
34496 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34497 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34498 .{ ._, ._, .mov, .tmp2d, .mem(.src0d), ._, ._ },
34499 .{ ._, ._l, .sa, .tmp2q, .ui(63), ._, ._ },
34500 .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ },
34501 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ },
34502 .{ ._, ._, .mov, .tmp2q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34503 .{ ._, ._, .mov, .tmp3q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34504 .{ ._, ._, .mov, .tmp4q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34505 .{ .@"0:", ._, .mov, .tmp5q, .lea(.tmp1q), ._, ._ },
34506 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34507 .{ ._, ._, .@"and", .tmp6q, .tmp2q, ._, ._ },
34508 .{ ._, ._r, .sh, .tmp5q, .ui(4), ._, ._ },
34509 .{ ._, ._l, .sh, .tmp6q, .ui(4), ._, ._ },
34510 .{ ._, ._, .@"and", .tmp5q, .tmp2q, ._, ._ },
34511 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34512 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34513 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34514 .{ ._, ._r, .sh, .tmp5q, .ui(2), ._, ._ },
34515 .{ ._, ._l, .sh, .tmp6q, .ui(2), ._, ._ },
34516 .{ ._, ._, .@"and", .tmp5q, .tmp3q, ._, ._ },
34517 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34518 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34519 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34520 .{ ._, ._r, .sh, .tmp5q, .ui(1), ._, ._ },
34521 .{ ._, ._l, .sh, .tmp6q, .ui(1), ._, ._ },
34522 .{ ._, ._, .@"and", .tmp5q, .tmp4q, ._, ._ },
34523 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34524 .{ ._, ._, .movbe, .memi(.dst0q, .tmp0), .tmp5q, ._, ._ },
34525 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34526 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34527 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34528 } },
34529 }, .{
34530 .required_features = .{ .@"64bit", null, null, null },
34531 .src_constraints = .{ .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34532 .patterns = &.{
34533 .{ .src = .{ .to_mem, .none, .none } },
34534 },
34535 .extra_temps = .{
34536 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34537 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34538 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34539 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34540 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34541 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34542 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34543 .unused,
34544 .unused,
34545 .unused,
34546 .unused,
34547 },
34548 .dst_temps = .{ .mem, .unused },
34549 .clobbers = .{ .eflags = true },
34550 .each = .{ .once = &.{
34551 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34552 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34553 .{ ._, ._, .mov, .tmp2d, .mem(.src0d), ._, ._ },
34554 .{ ._, ._l, .sa, .tmp2q, .ui(63), ._, ._ },
34555 .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ },
34556 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ },
34557 .{ ._, ._, .mov, .tmp2q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34558 .{ ._, ._, .mov, .tmp3q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34559 .{ ._, ._, .mov, .tmp4q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34560 .{ .@"0:", ._, .mov, .tmp5q, .lea(.tmp1q), ._, ._ },
34561 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34562 .{ ._, ._, .@"and", .tmp6q, .tmp2q, ._, ._ },
34563 .{ ._, ._r, .sh, .tmp5q, .ui(4), ._, ._ },
34564 .{ ._, ._l, .sh, .tmp6q, .ui(4), ._, ._ },
34565 .{ ._, ._, .@"and", .tmp5q, .tmp2q, ._, ._ },
34566 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34567 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34568 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34569 .{ ._, ._r, .sh, .tmp5q, .ui(2), ._, ._ },
34570 .{ ._, ._l, .sh, .tmp6q, .ui(2), ._, ._ },
34571 .{ ._, ._, .@"and", .tmp5q, .tmp3q, ._, ._ },
34572 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34573 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34574 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34575 .{ ._, ._r, .sh, .tmp5q, .ui(1), ._, ._ },
34576 .{ ._, ._l, .sh, .tmp6q, .ui(1), ._, ._ },
34577 .{ ._, ._, .@"and", .tmp5q, .tmp4q, ._, ._ },
34578 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34579 .{ ._, ._, .bswap, .tmp5q, ._, ._, ._ },
34580 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp5q, ._, ._ },
34581 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34582 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34583 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34584 } },
34585 }, .{
34586 .required_features = .{ .@"64bit", .movbe, null, null },
34587 .src_constraints = .{ .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34588 .patterns = &.{
34589 .{ .src = .{ .to_mem, .none, .none } },
34590 },
34591 .extra_temps = .{
34592 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34593 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34594 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34595 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34596 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34597 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34598 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34599 .unused,
34600 .unused,
34601 .unused,
34602 .unused,
34603 },
34604 .dst_temps = .{ .mem, .unused },
34605 .clobbers = .{ .eflags = true },
34606 .each = .{ .once = &.{
34607 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34608 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34609 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
34610 .{ ._, ._, .mov, .tmp2q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34611 .{ ._, ._, .mov, .tmp3q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34612 .{ ._, ._, .mov, .tmp4q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34613 .{ .@"0:", ._, .mov, .tmp5q, .lea(.tmp1q), ._, ._ },
34614 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34615 .{ ._, ._, .@"and", .tmp6q, .tmp2q, ._, ._ },
34616 .{ ._, ._r, .sh, .tmp5q, .ui(4), ._, ._ },
34617 .{ ._, ._l, .sh, .tmp6q, .ui(4), ._, ._ },
34618 .{ ._, ._, .@"and", .tmp5q, .tmp2q, ._, ._ },
34619 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34620 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34621 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34622 .{ ._, ._r, .sh, .tmp5q, .ui(2), ._, ._ },
34623 .{ ._, ._l, .sh, .tmp6q, .ui(2), ._, ._ },
34624 .{ ._, ._, .@"and", .tmp5q, .tmp3q, ._, ._ },
34625 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34626 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34627 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34628 .{ ._, ._r, .sh, .tmp5q, .ui(1), ._, ._ },
34629 .{ ._, ._l, .sh, .tmp6q, .ui(1), ._, ._ },
34630 .{ ._, ._, .@"and", .tmp5q, .tmp4q, ._, ._ },
34631 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34632 .{ ._, ._, .movbe, .memi(.dst0q, .tmp0), .tmp5q, ._, ._ },
34633 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34634 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34635 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34636 } },
34637 }, .{
34638 .required_features = .{ .@"64bit", null, null, null },
34639 .src_constraints = .{ .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34640 .patterns = &.{
34641 .{ .src = .{ .to_mem, .none, .none } },
34642 },
34643 .extra_temps = .{
34644 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34645 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34646 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34647 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34648 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34649 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34650 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34651 .unused,
34652 .unused,
34653 .unused,
34654 .unused,
34655 },
34656 .dst_temps = .{ .mem, .unused },
34657 .clobbers = .{ .eflags = true },
34658 .each = .{ .once = &.{
34659 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34660 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34661 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
34662 .{ ._, ._, .mov, .tmp2q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34663 .{ ._, ._, .mov, .tmp3q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34664 .{ ._, ._, .mov, .tmp4q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34665 .{ .@"0:", ._, .mov, .tmp5q, .lea(.tmp1q), ._, ._ },
34666 .{ ._, ._, .bswap, .tmp5q, ._, ._, ._ },
34667 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34668 .{ ._, ._, .@"and", .tmp6q, .tmp2q, ._, ._ },
34669 .{ ._, ._r, .sh, .tmp5q, .ui(4), ._, ._ },
34670 .{ ._, ._l, .sh, .tmp6q, .ui(4), ._, ._ },
34671 .{ ._, ._, .@"and", .tmp5q, .tmp2q, ._, ._ },
34672 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34673 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34674 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34675 .{ ._, ._r, .sh, .tmp5q, .ui(2), ._, ._ },
34676 .{ ._, ._l, .sh, .tmp6q, .ui(2), ._, ._ },
34677 .{ ._, ._, .@"and", .tmp5q, .tmp3q, ._, ._ },
34678 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34679 .{ ._, ._, .mov, .tmp6q, .tmp5q, ._, ._ },
34680 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34681 .{ ._, ._r, .sh, .tmp5q, .ui(1), ._, ._ },
34682 .{ ._, ._l, .sh, .tmp6q, .ui(1), ._, ._ },
34683 .{ ._, ._, .@"and", .tmp5q, .tmp4q, ._, ._ },
34684 .{ ._, ._, .@"or", .tmp5q, .tmp6q, ._, ._ },
34685 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp5q, ._, ._ },
34686 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34687 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34688 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34689 } },
34690 }, .{
34691 .required_features = .{ .@"64bit", .movbe, null, null },
34692 .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34693 .patterns = &.{
34694 .{ .src = .{ .to_mem, .none, .none } },
34695 },
34696 .extra_temps = .{
34697 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34698 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34699 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34700 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34701 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34702 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34703 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34704 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34705 .unused,
34706 .unused,
34707 .unused,
34708 },
34709 .dst_temps = .{ .mem, .unused },
34710 .clobbers = .{ .eflags = true },
34711 .each = .{ .once = &.{
34712 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34713 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34714 .{ ._, ._, .mov, .tmp2d, .mem(.src0d), ._, ._ },
34715 .{ ._, ._l, .sa, .tmp2q, .ui(63), ._, ._ },
34716 .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ },
34717 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ },
34718 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34719 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34720 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34721 .{ .@"0:", ._, .movbe, .tmp6q, .lea(.tmp1q), ._, ._ },
34722 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34723 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
34724 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
34725 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
34726 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34727 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34728 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34729 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
34730 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
34731 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
34732 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34733 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34734 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34735 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
34736 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
34737 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
34738 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
34739 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34740 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34741 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
34742 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
34743 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
34744 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34745 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34746 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34747 } },
34748 }, .{
34749 .required_features = .{ .@"64bit", null, null, null },
34750 .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34751 .patterns = &.{
34752 .{ .src = .{ .to_mem, .none, .none } },
34753 },
34754 .extra_temps = .{
34755 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34756 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34757 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34758 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34759 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34760 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34761 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34762 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34763 .unused,
34764 .unused,
34765 .unused,
34766 },
34767 .dst_temps = .{ .mem, .unused },
34768 .clobbers = .{ .eflags = true },
34769 .each = .{ .once = &.{
34770 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34771 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34772 .{ ._, ._, .mov, .tmp2d, .mem(.src0d), ._, ._ },
34773 .{ ._, ._l, .sa, .tmp2q, .ui(63), ._, ._ },
34774 .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ },
34775 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ },
34776 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34777 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34778 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34779 .{ .@"0:", ._, .mov, .tmp6q, .lea(.tmp1q), ._, ._ },
34780 .{ ._, ._, .bswap, .tmp6q, ._, ._, ._ },
34781 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34782 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
34783 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
34784 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
34785 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34786 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34787 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34788 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
34789 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
34790 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
34791 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34792 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34793 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34794 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
34795 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
34796 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
34797 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
34798 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34799 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34800 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
34801 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
34802 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
34803 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34804 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34805 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34806 } },
34807 }, .{
34808 .required_features = .{ .@"64bit", .movbe, null, null },
34809 .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34810 .patterns = &.{
34811 .{ .src = .{ .to_mem, .none, .none } },
34812 },
34813 .extra_temps = .{
34814 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34815 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34816 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34817 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34818 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34819 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34820 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34821 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34822 .unused,
34823 .unused,
34824 .unused,
34825 },
34826 .dst_temps = .{ .mem, .unused },
34827 .clobbers = .{ .eflags = true },
34828 .each = .{ .once = &.{
34829 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34830 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34831 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
34832 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ },
34833 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34834 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34835 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34836 .{ .@"0:", ._, .movbe, .tmp6q, .lea(.tmp1q), ._, ._ },
34837 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34838 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
34839 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
34840 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
34841 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34842 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34843 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34844 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
34845 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
34846 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
34847 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34848 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34849 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34850 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
34851 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
34852 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
34853 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
34854 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34855 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34856 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
34857 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
34858 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
34859 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34860 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34861 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34862 } },
34863 }, .{
34864 .required_features = .{ .@"64bit", null, null, null },
34865 .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } }, .any, .any },
34866 .patterns = &.{
34867 .{ .src = .{ .to_mem, .none, .none } },
34868 },
34869 .extra_temps = .{
34870 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34871 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34872 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34873 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34874 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34875 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34876 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34877 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34878 .unused,
34879 .unused,
34880 .unused,
34881 },
34882 .dst_temps = .{ .mem, .unused },
34883 .clobbers = .{ .eflags = true },
34884 .each = .{ .once = &.{
34885 .{ ._, ._, .mov, .tmp0d, .sia(-16, .dst0, .add_size), ._, ._ },
34886 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34887 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
34888 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp2q, ._, ._ },
34889 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34890 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34891 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34892 .{ .@"0:", ._, .mov, .tmp6q, .lea(.tmp1q), ._, ._ },
34893 .{ ._, ._, .bswap, .tmp6q, ._, ._, ._ },
34894 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34895 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
34896 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
34897 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
34898 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34899 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34900 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34901 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
34902 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
34903 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
34904 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34905 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34906 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34907 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
34908 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
34909 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
34910 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
34911 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34912 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34913 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
34914 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
34915 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
34916 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34917 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34918 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34919 } },
34920 }, .{
34921 .required_features = .{ .@"64bit", .movbe, null, null },
34922 .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, .any, .any },
34923 .patterns = &.{
34924 .{ .src = .{ .to_mem, .none, .none } },
34925 },
34926 .extra_temps = .{
34927 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34928 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34929 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34930 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34931 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34932 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34933 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34934 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34935 .unused,
34936 .unused,
34937 .unused,
34938 },
34939 .dst_temps = .{ .mem, .unused },
34940 .clobbers = .{ .eflags = true },
34941 .each = .{ .once = &.{
34942 .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ },
34943 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
34944 .{ ._, ._, .mov, .tmp2d, .mem(.src0d), ._, ._ },
34945 .{ ._, ._l, .sa, .tmp2q, .ui(63), ._, ._ },
34946 .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ },
34947 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
34948 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
34949 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
34950 .{ .@"0:", ._, .movbe, .tmp6q, .lea(.tmp1q), ._, ._ },
34951 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34952 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
34953 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
34954 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
34955 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
34956 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34957 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34958 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
34959 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
34960 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
34961 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
34962 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34963 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34964 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
34965 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
34966 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
34967 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
34968 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
34969 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
34970 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
34971 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
34972 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
34973 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
34974 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
34975 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
34976 } },
34977 }, .{
34978 .required_features = .{ .@"64bit", null, null, null },
34979 .src_constraints = .{ .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } }, .any, .any },
34980 .patterns = &.{
34981 .{ .src = .{ .to_mem, .none, .none } },
34982 },
34983 .extra_temps = .{
34984 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
34985 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
34986 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34987 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34988 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34989 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34990 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34991 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
34992 .unused,
34993 .unused,
34994 .unused,
34995 },
34996 .dst_temps = .{ .mem, .unused },
34997 .clobbers = .{ .eflags = true },
34998 .each = .{ .once = &.{
34999 .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ },
35000 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
35001 .{ ._, ._, .mov, .tmp2d, .mem(.src0d), ._, ._ },
35002 .{ ._, ._l, .sa, .tmp2q, .ui(63), ._, ._ },
35003 .{ ._, ._r, .sa, .tmp2q, .ui(63), ._, ._ },
35004 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
35005 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
35006 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
35007 .{ .@"0:", ._, .mov, .tmp6q, .lea(.tmp1q), ._, ._ },
35008 .{ ._, ._, .bswap, .tmp6q, ._, ._, ._ },
35009 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35010 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
35011 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
35012 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
35013 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
35014 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35015 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35016 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
35017 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
35018 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
35019 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
35020 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35021 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35022 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
35023 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
35024 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
35025 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
35026 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35027 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35028 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
35029 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
35030 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
35031 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
35032 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
35033 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
35034 } },
35035 }, .{
35036 .required_features = .{ .@"64bit", .movbe, null, null },
35037 .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any },
35038 .patterns = &.{
35039 .{ .src = .{ .to_mem, .none, .none } },
35040 },
35041 .extra_temps = .{
35042 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
35043 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
35044 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35045 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35046 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35047 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35048 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35049 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35050 .unused,
35051 .unused,
35052 .unused,
35053 },
35054 .dst_temps = .{ .mem, .unused },
35055 .clobbers = .{ .eflags = true },
35056 .each = .{ .once = &.{
35057 .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ },
35058 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
35059 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
35060 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
35061 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
35062 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
35063 .{ .@"0:", ._, .movbe, .tmp6q, .lea(.tmp1q), ._, ._ },
35064 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35065 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
35066 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
35067 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
35068 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
35069 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35070 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35071 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
35072 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
35073 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
35074 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
35075 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35076 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35077 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
35078 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
35079 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
35080 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
35081 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35082 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35083 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
35084 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
35085 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
35086 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
35087 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
35088 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
35089 } },
35090 }, .{
35091 .required_features = .{ .@"64bit", null, null, null },
35092 .src_constraints = .{ .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } }, .any, .any },
35093 .patterns = &.{
35094 .{ .src = .{ .to_mem, .none, .none } },
35095 },
35096 .extra_temps = .{
35097 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
35098 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
35099 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35100 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35101 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35102 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35103 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35104 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
35105 .unused,
35106 .unused,
35107 .unused,
35108 },
35109 .dst_temps = .{ .mem, .unused },
35110 .clobbers = .{ .eflags = true },
35111 .each = .{ .once = &.{
35112 .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ },
35113 .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ },
35114 .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ },
35115 .{ ._, ._, .mov, .tmp3q, .uia(0b00001111000011110000111100001111, .none, .repeat), ._, ._ },
35116 .{ ._, ._, .mov, .tmp4q, .uia(0b00110011001100110011001100110011, .none, .repeat), ._, ._ },
35117 .{ ._, ._, .mov, .tmp5q, .uia(0b01010101010101010101010101010101, .none, .repeat), ._, ._ },
35118 .{ .@"0:", ._, .mov, .tmp6q, .lea(.tmp1q), ._, ._ },
35119 .{ ._, ._, .bswap, .tmp6q, ._, ._, ._ },
35120 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35121 .{ ._, ._, .@"and", .tmp7q, .tmp3q, ._, ._ },
35122 .{ ._, ._r, .sh, .tmp6q, .ui(4), ._, ._ },
35123 .{ ._, ._l, .sh, .tmp7q, .ui(4), ._, ._ },
35124 .{ ._, ._, .@"and", .tmp6q, .tmp3q, ._, ._ },
35125 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35126 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35127 .{ ._, ._, .@"and", .tmp7q, .tmp4q, ._, ._ },
35128 .{ ._, ._r, .sh, .tmp6q, .ui(2), ._, ._ },
35129 .{ ._, ._l, .sh, .tmp7q, .ui(2), ._, ._ },
35130 .{ ._, ._, .@"and", .tmp6q, .tmp4q, ._, ._ },
35131 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35132 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35133 .{ ._, ._, .@"and", .tmp7q, .tmp5q, ._, ._ },
35134 .{ ._, ._r, .sh, .tmp6q, .ui(1), ._, ._ },
35135 .{ ._, ._l, .sh, .tmp7q, .ui(1), ._, ._ },
35136 .{ ._, ._, .@"and", .tmp6q, .tmp5q, ._, ._ },
35137 .{ ._, ._, .@"or", .tmp6q, .tmp7q, ._, ._ },
35138 .{ ._, ._, .mov, .tmp7q, .tmp6q, ._, ._ },
35139 .{ ._, ._rd, .sh, .tmp6q, .tmp2q, .uia(64, .src0, .sub_bit_size_rem_64), ._ },
35140 .{ ._, ._, .mov, .tmp2q, .tmp7q, ._, ._ },
35141 .{ ._, ._, .mov, .memi(.dst0q, .tmp0), .tmp6q, ._, ._ },
35142 .{ ._, ._, .lea, .tmp1p, .lead(.tmp1, 8), ._, ._ },
35143 .{ ._, ._, .sub, .tmp0d, .si(8), ._, ._ },
35144 .{ ._, ._ae, .j, .@"0b", ._, ._, ._ },
35145 } },
35146 } }) catch |err| switch (err) {
35147 error.SelectFailed => return cg.fail("failed to select {s} {} {}", .{
35148 @tagName(air_tag),
35149 ty_op.ty.toType().fmt(pt),
35150 ops[0].tracking(cg),
35151 }),
35152 else => |e| return e,
35153 };
35154 try res[0].finish(inst, &.{ty_op.operand}, &ops, cg);
35155 },
3202135156
3202235157 .cmp_vector, .cmp_vector_optimized => |air_tag| if (use_old) try cg.airCmpVector(inst) else fallback: {
3202335158 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
......@@ -59301,7 +62436,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5930162436 },
5930262437 .extra_temps = .{
5930362438 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
59304 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
62439 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
5930562440 .unused,
5930662441 .unused,
5930762442 .unused,
......@@ -59328,7 +62463,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5932862463 },
5932962464 .extra_temps = .{
5933062465 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
59331 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
62466 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
5933262467 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
5933362468 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
5933462469 .unused,
......@@ -60950,7 +64085,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6095064085 },
6095164086 .extra_temps = .{
6095264087 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
60953 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
64088 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6095464089 .unused,
6095564090 .unused,
6095664091 .unused,
......@@ -60977,7 +64112,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6097764112 },
6097864113 .extra_temps = .{
6097964114 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
60980 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
64115 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6098164116 .unused,
6098264117 .unused,
6098364118 .unused,
......@@ -61003,7 +64138,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6100364138 },
6100464139 .extra_temps = .{
6100564140 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
61006 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
64141 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6100764142 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6100864143 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6100964144 .unused,
......@@ -61034,7 +64169,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6103464169 },
6103564170 .extra_temps = .{
6103664171 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
61037 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
64172 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6103864173 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6103964174 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6104064175 .unused,
......@@ -62506,7 +65641,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6250665641 },
6250765642 .extra_temps = .{
6250865643 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
62509 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
65644 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6251065645 .unused,
6251165646 .unused,
6251265647 .unused,
......@@ -62533,7 +65668,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6253365668 },
6253465669 .extra_temps = .{
6253565670 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
62536 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
65671 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6253765672 .unused,
6253865673 .unused,
6253965674 .unused,
......@@ -62560,7 +65695,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6256065695 },
6256165696 .extra_temps = .{
6256265697 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
62563 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
65698 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6256465699 .unused,
6256565700 .unused,
6256665701 .unused,
......@@ -62586,7 +65721,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6258665721 },
6258765722 .extra_temps = .{
6258865723 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
62589 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
65724 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6259065725 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6259165726 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6259265727 .unused,
......@@ -62618,7 +65753,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6261865753 },
6261965754 .extra_temps = .{
6262065755 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
62621 .{ .type = .vector_16_u8, .kind = .{ .pshufb_cm_mem = .{ .from = .dword, .to = .byte } } },
65756 .{ .type = .vector_16_u8, .kind = .{ .pshufb_trunc_mem = .{ .from = .dword, .to = .byte } } },
6262265757 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6262365758 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
6262465759 .unused,
......@@ -91576,9 +94711,12 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
9157694711}
9157794712
9157894713const MoveStrategy = union(enum) {
91579 move: Mir.Inst.FixedTag,
91580 x87_load_store,
94714 move_through_gpr,
94715 load_store_through_frame,
94716 load_store: Mir.Inst.FixedTag,
94717 load_store_x87,
9158194718 insert_extract: InsertExtract,
94719 insert_or_extract_through_gpr: InsertExtract,
9158294720 vex_insert_extract: InsertExtract,
9158394721
9158494722 const InsertExtract = struct {
......@@ -91586,194 +94724,215 @@ const MoveStrategy = union(enum) {
9158694724 extract: Mir.Inst.FixedTag,
9158794725 };
9158894726
91589 pub fn read(strat: MoveStrategy, self: *CodeGen, dst_reg: Register, src_mem: Memory) !void {
94727 pub fn read(strat: MoveStrategy, cg: *CodeGen, dst_reg: Register, src_mem: Memory) !void {
9159094728 switch (strat) {
91591 .move => |tag| try self.asmRegisterMemory(tag, switch (tag[1]) {
91592 else => dst_reg,
91593 .lea => if (dst_reg.bitSize() >= 32) dst_reg else dst_reg.to32(),
91594 }, src_mem),
91595 .x87_load_store => if (dst_reg != .st0 and self.register_manager.isKnownRegFree(.st7)) {
91596 try self.asmMemory(.{ .f_, .ld }, src_mem);
94729 .move_through_gpr => {
94730 const tmp_reg = try cg.register_manager.allocReg(null, abi.RegisterClass.gp);
94731 try cg.asmRegisterMemory(.{ ._, .movzx }, tmp_reg.to32(), src_mem);
94732 try cg.asmRegisterRegister(.{ ._d, .mov }, dst_reg, tmp_reg.to32());
94733 },
94734 .load_store_through_frame => {
94735 const tmp_frame_index = try cg.allocFrameIndex(.init(.{
94736 .size = 16,
94737 .alignment = .@"16",
94738 }));
94739 const tmp_reg = try cg.register_manager.allocReg(null, abi.RegisterClass.gp);
94740 try cg.asmRegisterMemory(.{ ._, .movzx }, tmp_reg.to32(), src_mem);
94741 try cg.asmMemoryRegister(.{ ._, .mov }, .{
94742 .base = .{ .frame = tmp_frame_index },
94743 .mod = .{ .rm = .{ .size = .dword } },
94744 }, tmp_reg.to32());
94745 try cg.asmRegisterMemory(.{ ._ps, .mova }, dst_reg, .{
94746 .base = .{ .frame = tmp_frame_index },
94747 .mod = .{ .rm = .{ .size = .xword } },
94748 });
94749 },
94750 .load_store => |tag| {
94751 if (tag[0] == ._ps and tag[1] == .movl) try cg.asmRegisterRegister(.{ .p_, .xor }, dst_reg, dst_reg);
94752 try cg.asmRegisterMemory(tag, switch (tag[1]) {
94753 else => dst_reg,
94754 .lea => if (dst_reg.bitSize() >= 32) dst_reg else dst_reg.to32(),
94755 }, src_mem);
94756 },
94757 .load_store_x87 => if (dst_reg != .st0 and cg.register_manager.isKnownRegFree(.st7)) {
94758 try cg.asmMemory(.{ .f_, .ld }, src_mem);
9159794759 switch (dst_reg) {
91598 .st1, .st2, .st3, .st4, .st5, .st6 => try self.asmRegister(.{ .f_p, .st }, @enumFromInt(@intFromEnum(dst_reg) + 1)),
91599 .st7 => try self.asmOpOnly(.{ .f_cstp, .in }),
94760 .st1, .st2, .st3, .st4, .st5, .st6 => try cg.asmRegister(.{ .f_p, .st }, @enumFromInt(@intFromEnum(dst_reg) + 1)),
94761 .st7 => try cg.asmOpOnly(.{ .f_cstp, .in }),
9160094762 else => unreachable,
9160194763 }
9160294764 } else {
91603 try self.asmRegister(.{ .f_p, .st }, dst_reg);
91604 try self.asmMemory(.{ .f_, .ld }, src_mem);
94765 try cg.asmRegister(.{ .f_p, .st }, dst_reg);
94766 try cg.asmMemory(.{ .f_, .ld }, src_mem);
9160594767 switch (dst_reg) {
9160694768 .st0 => {},
91607 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try self.asmRegister(.{ .f_, .xch }, dst_reg),
94769 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try cg.asmRegister(.{ .f_, .xch }, dst_reg),
9160894770 else => unreachable,
9160994771 }
9161094772 },
91611 .insert_extract => |ie| if (ie.insert[0] != .p_w or self.hasFeature(.sse2))
91612 try self.asmRegisterMemoryImmediate(ie.insert, dst_reg, src_mem, .u(0))
91613 else {
91614 const tmp_frame_index = try self.allocFrameIndex(.init(.{
94773 .insert_extract, .insert_or_extract_through_gpr => |ie| {
94774 try cg.asmRegisterRegister(.{ .p_, .xor }, dst_reg, dst_reg);
94775 try cg.asmRegisterMemoryImmediate(ie.insert, dst_reg, src_mem, .u(0));
94776 },
94777 .vex_insert_extract => |ie| {
94778 try cg.asmRegisterRegisterRegister(.{ .vp_, .xor }, dst_reg, dst_reg, dst_reg);
94779 try cg.asmRegisterRegisterMemoryImmediate(ie.insert, dst_reg, dst_reg, src_mem, .u(0));
94780 },
94781 }
94782 }
94783 pub fn write(strat: MoveStrategy, cg: *CodeGen, dst_mem: Memory, src_reg: Register) !void {
94784 switch (strat) {
94785 .move_through_gpr => {
94786 const tmp_reg = try cg.register_manager.allocReg(null, abi.RegisterClass.gp);
94787 try cg.asmRegisterRegister(.{ ._d, .mov }, tmp_reg.to32(), src_reg.to128());
94788 try cg.asmMemoryRegister(
94789 .{ ._, .mov },
94790 dst_mem,
94791 registerAlias(tmp_reg, @intCast(@divExact(dst_mem.mod.rm.size.bitSize(cg.target), 8))),
94792 );
94793 },
94794 .load_store_through_frame => {
94795 const tmp_frame_index = try cg.allocFrameIndex(.init(.{
9161594796 .size = 16,
9161694797 .alignment = .@"16",
9161794798 }));
91618 const tmp_reg = try self.register_manager.allocReg(null, abi.RegisterClass.gp);
91619 try self.asmRegisterMemory(.{ ._, .movzx }, tmp_reg.to32(), src_mem);
91620 try self.asmMemoryRegister(.{ ._, .mov }, .{
91621 .base = .{ .frame = tmp_frame_index },
91622 .mod = .{ .rm = .{ .size = .word } },
91623 }, tmp_reg.to16());
91624 try self.asmRegisterMemory(.{ ._ps, .mova }, dst_reg.to128(), .{
94799 try cg.asmMemoryRegister(.{ ._ps, .mova }, .{
9162594800 .base = .{ .frame = tmp_frame_index },
9162694801 .mod = .{ .rm = .{ .size = .xword } },
94802 }, src_reg.to128());
94803 const tmp_reg = try cg.register_manager.allocReg(null, abi.RegisterClass.gp);
94804 try cg.asmRegisterMemory(.{ ._, .movzx }, tmp_reg.to32(), .{
94805 .base = .{ .frame = tmp_frame_index },
94806 .mod = .{ .rm = .{ .size = .word } },
9162794807 });
94808 try cg.asmMemoryRegister(.{ ._, .mov }, dst_mem, tmp_reg.to16());
9162894809 },
91629 .vex_insert_extract => |ie| try self.asmRegisterRegisterMemoryImmediate(
91630 ie.insert,
91631 dst_reg,
91632 dst_reg,
91633 src_mem,
91634 .u(0),
91635 ),
91636 }
91637 }
91638 pub fn write(strat: MoveStrategy, self: *CodeGen, dst_mem: Memory, src_reg: Register) !void {
91639 switch (strat) {
91640 .move => |tag| try self.asmMemoryRegister(tag, dst_mem, src_reg),
91641 .x87_load_store => if (self.register_manager.isKnownRegFree(.st7)) {
91642 try self.asmRegister(.{ .f_, .ld }, src_reg);
91643 try self.asmMemory(.{ .f_p, .st }, dst_mem);
94810 .load_store => |tag| try cg.asmMemoryRegister(tag, dst_mem, src_reg),
94811 .load_store_x87 => if (cg.register_manager.isKnownRegFree(.st7)) {
94812 try cg.asmRegister(.{ .f_, .ld }, src_reg);
94813 try cg.asmMemory(.{ .f_p, .st }, dst_mem);
9164494814 } else {
9164594815 switch (src_reg) {
9164694816 .st0 => {},
91647 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try self.asmRegister(.{ .f_, .xch }, src_reg),
94817 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try cg.asmRegister(.{ .f_, .xch }, src_reg),
9164894818 else => unreachable,
9164994819 }
91650 try self.asmMemory(.{ .f_p, .st }, dst_mem);
91651 try self.asmMemory(.{ .f_, .ld }, dst_mem);
94820 try cg.asmMemory(.{ .f_p, .st }, dst_mem);
94821 try cg.asmMemory(.{ .f_, .ld }, dst_mem);
9165294822 switch (src_reg) {
9165394823 .st0 => {},
91654 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try self.asmRegister(.{ .f_, .xch }, src_reg),
94824 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try cg.asmRegister(.{ .f_, .xch }, src_reg),
9165594825 else => unreachable,
9165694826 }
9165794827 },
91658 .insert_extract, .vex_insert_extract => |ie| if (ie.extract[0] != .p_w or self.hasFeature(.sse4_1))
91659 try self.asmMemoryRegisterImmediate(ie.extract, dst_mem, src_reg, .u(0))
91660 else if (self.hasFeature(.sse2)) {
91661 const tmp_reg = try self.register_manager.allocReg(null, abi.RegisterClass.gp);
91662 try self.asmRegisterRegisterImmediate(ie.extract, tmp_reg.to32(), src_reg.to128(), .u(0));
91663 try self.asmMemoryRegister(.{ ._, .mov }, dst_mem, tmp_reg.to16());
91664 } else {
91665 const tmp_frame_index = try self.allocFrameIndex(.init(.{
91666 .size = 16,
91667 .alignment = .@"16",
91668 }));
91669 try self.asmMemoryRegister(.{ ._ps, .mova }, .{
91670 .base = .{ .frame = tmp_frame_index },
91671 .mod = .{ .rm = .{ .size = .xword } },
91672 }, src_reg.to128());
91673 const tmp_reg = try self.register_manager.allocReg(null, abi.RegisterClass.gp);
91674 try self.asmRegisterMemory(.{ ._, .movzx }, tmp_reg.to32(), .{
91675 .base = .{ .frame = tmp_frame_index },
91676 .mod = .{ .rm = .{ .size = .word } },
91677 });
91678 try self.asmMemoryRegister(.{ ._, .mov }, dst_mem, tmp_reg.to16());
94828 .insert_extract, .vex_insert_extract => |ie| try cg.asmMemoryRegisterImmediate(ie.extract, dst_mem, src_reg, .u(0)),
94829 .insert_or_extract_through_gpr => |ie| {
94830 const tmp_reg = try cg.register_manager.allocReg(null, abi.RegisterClass.gp);
94831 try cg.asmRegisterRegisterImmediate(ie.extract, tmp_reg.to32(), src_reg.to128(), .u(0));
94832 try cg.asmMemoryRegister(.{ ._, .mov }, dst_mem, tmp_reg.to16());
9167994833 },
9168094834 }
9168194835 }
9168294836};
91683fn moveStrategy(self: *CodeGen, ty: Type, class: Register.Class, aligned: bool) !MoveStrategy {
91684 const pt = self.pt;
94837fn moveStrategy(cg: *CodeGen, ty: Type, class: Register.Class, aligned: bool) !MoveStrategy {
94838 const pt = cg.pt;
9168594839 const zcu = pt.zcu;
9168694840 switch (class) {
91687 .general_purpose, .segment => return .{ .move = .{ ._, .mov } },
91688 .x87 => return .x87_load_store,
94841 .general_purpose, .segment => return .{ .load_store = .{ ._, .mov } },
94842 .x87 => return .load_store_x87,
9168994843 .mmx => {},
9169094844 .sse => switch (ty.zigTypeTag(zcu)) {
9169194845 else => {
91692 const classes = std.mem.sliceTo(&abi.classifySystemV(ty, zcu, self.target.*, .other), .none);
94846 const classes = std.mem.sliceTo(&abi.classifySystemV(ty, zcu, cg.target.*, .other), .none);
9169394847 assert(std.mem.indexOfNone(abi.Class, classes, &.{
9169494848 .integer, .sse, .sseup, .memory, .float, .float_combine,
9169594849 }) == null);
9169694850 const abi_size = ty.abiSize(zcu);
91697 if (abi_size < 4 or
91698 std.mem.indexOfScalar(abi.Class, classes, .integer) != null) switch (abi_size) {
91699 1 => if (self.hasFeature(.avx)) return .{ .vex_insert_extract = .{
94851 if (abi_size < 4 or std.mem.indexOfScalar(abi.Class, classes, .integer) != null) switch (abi_size) {
94852 1 => return if (cg.hasFeature(.avx)) .{ .vex_insert_extract = .{
9170094853 .insert = .{ .vp_b, .insr },
9170194854 .extract = .{ .vp_b, .extr },
91702 } } else if (self.hasFeature(.sse4_2)) return .{ .insert_extract = .{
94855 } } else if (cg.hasFeature(.sse4_1)) .{ .insert_extract = .{
9170394856 .insert = .{ .p_b, .insr },
9170494857 .extract = .{ .p_b, .extr },
91705 } },
91706 2 => return if (self.hasFeature(.avx)) .{ .vex_insert_extract = .{
94858 } } else if (cg.hasFeature(.sse2)) .move_through_gpr else .load_store_through_frame,
94859 2 => return if (cg.hasFeature(.avx)) .{ .vex_insert_extract = .{
9170794860 .insert = .{ .vp_w, .insr },
9170894861 .extract = .{ .vp_w, .extr },
91709 } } else .{ .insert_extract = .{
94862 } } else if (cg.hasFeature(.sse4_1)) .{ .insert_extract = .{
9171094863 .insert = .{ .p_w, .insr },
9171194864 .extract = .{ .p_w, .extr },
91712 } },
91713 3...4 => return .{ .move = .{ if (self.hasFeature(.avx))
94865 } } else if (cg.hasFeature(.sse2)) .{ .insert_or_extract_through_gpr = .{
94866 .insert = .{ .p_w, .insr },
94867 .extract = .{ .p_w, .extr },
94868 } } else .load_store_through_frame,
94869 3...4 => return .{ .load_store = .{ if (cg.hasFeature(.avx))
9171494870 .v_d
91715 else if (self.hasFeature(.sse2))
94871 else if (cg.hasFeature(.sse2))
9171694872 ._d
9171794873 else
9171894874 ._ss, .mov } },
91719 5...8 => return .{ .move = if (self.hasFeature(.avx))
94875 5...8 => return .{ .load_store = if (cg.hasFeature(.avx))
9172094876 .{ .v_q, .mov }
91721 else if (self.hasFeature(.sse2))
94877 else if (cg.hasFeature(.sse2))
9172294878 .{ ._q, .mov }
9172394879 else
9172494880 .{ ._ps, .movl } },
91725 9...16 => return .{ .move = if (self.hasFeature(.avx))
94881 9...16 => return .{ .load_store = if (cg.hasFeature(.avx))
9172694882 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91727 else if (self.hasFeature(.sse2))
94883 else if (cg.hasFeature(.sse2))
9172894884 .{ if (aligned) ._dqa else ._dqu, .mov }
9172994885 else
9173094886 .{ ._ps, if (aligned) .mova else .movu } },
91731 17...32 => if (self.hasFeature(.avx))
91732 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
94887 17...32 => if (cg.hasFeature(.avx))
94888 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9173394889 else => {},
9173494890 } else switch (abi_size) {
91735 4 => return .{ .move = if (self.hasFeature(.avx))
94891 4 => return .{ .load_store = if (cg.hasFeature(.avx))
9173694892 .{ .v_ss, .mov }
9173794893 else
9173894894 .{ ._ss, .mov } },
91739 5...8 => return .{ .move = if (self.hasFeature(.avx))
94895 5...8 => return .{ .load_store = if (cg.hasFeature(.avx))
9174094896 .{ .v_sd, .mov }
91741 else if (self.hasFeature(.sse2))
94897 else if (cg.hasFeature(.sse2))
9174294898 .{ ._sd, .mov }
9174394899 else
9174494900 .{ ._ps, .movl } },
91745 9...16 => return .{ .move = if (self.hasFeature(.avx))
94901 9...16 => return .{ .load_store = if (cg.hasFeature(.avx))
9174694902 .{ .v_pd, if (aligned) .mova else .movu }
91747 else if (self.hasFeature(.sse2))
94903 else if (cg.hasFeature(.sse2))
9174894904 .{ ._pd, if (aligned) .mova else .movu }
9174994905 else
9175094906 .{ ._ps, if (aligned) .mova else .movu } },
91751 17...32 => if (self.hasFeature(.avx))
91752 return .{ .move = .{ .v_pd, if (aligned) .mova else .movu } },
94907 17...32 => if (cg.hasFeature(.avx))
94908 return .{ .load_store = .{ .v_pd, if (aligned) .mova else .movu } },
9175394909 else => {},
9175494910 }
9175594911 },
91756 .float => switch (ty.floatBits(self.target.*)) {
91757 16 => return if (self.hasFeature(.avx)) .{ .vex_insert_extract = .{
94912 .float => switch (ty.floatBits(cg.target.*)) {
94913 16 => return if (cg.hasFeature(.avx)) .{ .vex_insert_extract = .{
9175894914 .insert = .{ .vp_w, .insr },
9175994915 .extract = .{ .vp_w, .extr },
91760 } } else .{ .insert_extract = .{
94916 } } else if (cg.hasFeature(.sse4_1)) .{ .insert_extract = .{
9176194917 .insert = .{ .p_w, .insr },
9176294918 .extract = .{ .p_w, .extr },
91763 } },
91764 32 => return .{ .move = if (self.hasFeature(.avx))
94919 } } else if (cg.hasFeature(.sse2)) .{ .insert_or_extract_through_gpr = .{
94920 .insert = .{ .p_w, .insr },
94921 .extract = .{ .p_w, .extr },
94922 } } else .load_store_through_frame,
94923 32 => return .{ .load_store = if (cg.hasFeature(.avx))
9176594924 .{ .v_ss, .mov }
9176694925 else
9176794926 .{ ._ss, .mov } },
91768 64 => return .{ .move = if (self.hasFeature(.avx))
94927 64 => return .{ .load_store = if (cg.hasFeature(.avx))
9176994928 .{ .v_sd, .mov }
91770 else if (self.hasFeature(.sse2))
94929 else if (cg.hasFeature(.sse2))
9177194930 .{ ._sd, .mov }
9177294931 else
9177394932 .{ ._ps, .movl } },
91774 128 => return .{ .move = if (self.hasFeature(.avx))
94933 128 => return .{ .load_store = if (cg.hasFeature(.avx))
9177594934 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91776 else if (self.hasFeature(.sse2))
94935 else if (cg.hasFeature(.sse2))
9177794936 .{ if (aligned) ._dqa else ._dqu, .mov }
9177894937 else
9177994938 .{ ._ps, if (aligned) .mova else .movu } },
......@@ -91781,160 +94940,163 @@ fn moveStrategy(self: *CodeGen, ty: Type, class: Register.Class, aligned: bool)
9178194940 },
9178294941 .vector => switch (ty.childType(zcu).zigTypeTag(zcu)) {
9178394942 .bool => switch (ty.vectorLen(zcu)) {
91784 1...8 => if (self.hasFeature(.avx)) return .{ .vex_insert_extract = .{
94943 1...8 => return if (cg.hasFeature(.avx)) .{ .vex_insert_extract = .{
9178594944 .insert = .{ .vp_b, .insr },
9178694945 .extract = .{ .vp_b, .extr },
91787 } } else if (self.hasFeature(.sse4_2)) return .{ .insert_extract = .{
94946 } } else if (cg.hasFeature(.sse4_1)) .{ .insert_extract = .{
9178894947 .insert = .{ .p_b, .insr },
9178994948 .extract = .{ .p_b, .extr },
91790 } },
91791 9...16 => return if (self.hasFeature(.avx)) .{ .vex_insert_extract = .{
94949 } } else if (cg.hasFeature(.sse2)) .move_through_gpr else .load_store_through_frame,
94950 9...16 => return if (cg.hasFeature(.avx)) .{ .vex_insert_extract = .{
9179294951 .insert = .{ .vp_w, .insr },
9179394952 .extract = .{ .vp_w, .extr },
91794 } } else .{ .insert_extract = .{
94953 } } else if (cg.hasFeature(.sse4_1)) .{ .insert_extract = .{
9179594954 .insert = .{ .p_w, .insr },
9179694955 .extract = .{ .p_w, .extr },
91797 } },
91798 17...32 => return .{ .move = .{ if (self.hasFeature(.avx))
94956 } } else if (cg.hasFeature(.sse2)) .{ .insert_or_extract_through_gpr = .{
94957 .insert = .{ .p_w, .insr },
94958 .extract = .{ .p_w, .extr },
94959 } } else .load_store_through_frame,
94960 17...32 => return .{ .load_store = .{ if (cg.hasFeature(.avx))
9179994961 .v_d
91800 else if (self.hasFeature(.sse2))
94962 else if (cg.hasFeature(.sse2))
9180194963 ._d
9180294964 else
9180394965 ._ss, .mov } },
91804 33...64 => return .{ .move = if (self.hasFeature(.avx))
94966 33...64 => return .{ .load_store = if (cg.hasFeature(.avx))
9180594967 .{ .v_q, .mov }
91806 else if (self.hasFeature(.sse2))
94968 else if (cg.hasFeature(.sse2))
9180794969 .{ ._q, .mov }
9180894970 else
9180994971 .{ ._ps, .movl } },
91810 65...128 => return .{ .move = if (self.hasFeature(.avx))
94972 65...128 => return .{ .load_store = if (cg.hasFeature(.avx))
9181194973 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91812 else if (self.hasFeature(.sse2))
94974 else if (cg.hasFeature(.sse2))
9181394975 .{ if (aligned) ._dqa else ._dqu, .mov }
9181494976 else
9181594977 .{ ._ps, if (aligned) .mova else .movu } },
91816 129...256 => if (self.hasFeature(.avx))
91817 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
94978 129...256 => if (cg.hasFeature(.avx))
94979 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9181894980 else => {},
9181994981 },
9182094982 .int => switch (ty.childType(zcu).intInfo(zcu).bits) {
9182194983 1...8 => switch (ty.vectorLen(zcu)) {
91822 1...16 => return .{ .move = if (self.hasFeature(.avx))
94984 1...16 => return .{ .load_store = if (cg.hasFeature(.avx))
9182394985 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91824 else if (self.hasFeature(.sse2))
94986 else if (cg.hasFeature(.sse2))
9182594987 .{ if (aligned) ._dqa else ._dqu, .mov }
9182694988 else
9182794989 .{ ._ps, if (aligned) .mova else .movu } },
91828 17...32 => if (self.hasFeature(.avx))
91829 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
94990 17...32 => if (cg.hasFeature(.avx))
94991 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9183094992 else => {},
9183194993 },
9183294994 9...16 => switch (ty.vectorLen(zcu)) {
91833 1...8 => return .{ .move = if (self.hasFeature(.avx))
94995 1...8 => return .{ .load_store = if (cg.hasFeature(.avx))
9183494996 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91835 else if (self.hasFeature(.sse2))
94997 else if (cg.hasFeature(.sse2))
9183694998 .{ if (aligned) ._dqa else ._dqu, .mov }
9183794999 else
9183895000 .{ ._ps, if (aligned) .mova else .movu } },
91839 9...16 => if (self.hasFeature(.avx))
91840 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95001 9...16 => if (cg.hasFeature(.avx))
95002 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9184195003 else => {},
9184295004 },
9184395005 17...32 => switch (ty.vectorLen(zcu)) {
91844 1...4 => return .{ .move = if (self.hasFeature(.avx))
95006 1...4 => return .{ .load_store = if (cg.hasFeature(.avx))
9184595007 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91846 else if (self.hasFeature(.sse2))
95008 else if (cg.hasFeature(.sse2))
9184795009 .{ if (aligned) ._dqa else ._dqu, .mov }
9184895010 else
9184995011 .{ ._ps, if (aligned) .mova else .movu } },
91850 5...8 => if (self.hasFeature(.avx))
91851 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95012 5...8 => if (cg.hasFeature(.avx))
95013 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9185295014 else => {},
9185395015 },
9185495016 33...64 => switch (ty.vectorLen(zcu)) {
91855 1...2 => return .{ .move = if (self.hasFeature(.avx))
95017 1...2 => return .{ .load_store = if (cg.hasFeature(.avx))
9185695018 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91857 else if (self.hasFeature(.sse2))
95019 else if (cg.hasFeature(.sse2))
9185895020 .{ if (aligned) ._dqa else ._dqu, .mov }
9185995021 else
9186095022 .{ ._ps, if (aligned) .mova else .movu } },
91861 3...4 => if (self.hasFeature(.avx))
91862 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95023 3...4 => if (cg.hasFeature(.avx))
95024 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9186395025 else => {},
9186495026 },
9186595027 65...128 => switch (ty.vectorLen(zcu)) {
91866 1 => return .{ .move = if (self.hasFeature(.avx))
95028 1 => return .{ .load_store = if (cg.hasFeature(.avx))
9186795029 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91868 else if (self.hasFeature(.sse2))
95030 else if (cg.hasFeature(.sse2))
9186995031 .{ if (aligned) ._dqa else ._dqu, .mov }
9187095032 else
9187195033 .{ ._ps, if (aligned) .mova else .movu } },
91872 2 => if (self.hasFeature(.avx))
91873 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95034 2 => if (cg.hasFeature(.avx))
95035 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9187495036 else => {},
9187595037 },
9187695038 129...256 => switch (ty.vectorLen(zcu)) {
91877 1 => if (self.hasFeature(.avx))
91878 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95039 1 => if (cg.hasFeature(.avx))
95040 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9187995041 else => {},
9188095042 },
9188195043 else => {},
9188295044 },
9188395045 .pointer, .optional => if (ty.childType(zcu).isPtrAtRuntime(zcu))
9188495046 switch (ty.vectorLen(zcu)) {
91885 1...2 => return .{ .move = if (self.hasFeature(.avx))
95047 1...2 => return .{ .load_store = if (cg.hasFeature(.avx))
9188695048 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91887 else if (self.hasFeature(.sse2))
95049 else if (cg.hasFeature(.sse2))
9188895050 .{ if (aligned) ._dqa else ._dqu, .mov }
9188995051 else
9189095052 .{ ._ps, if (aligned) .mova else .movu } },
91891 3...4 => if (self.hasFeature(.avx))
91892 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95053 3...4 => if (cg.hasFeature(.avx))
95054 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9189395055 else => {},
9189495056 }
9189595057 else
9189695058 unreachable,
91897 .float => switch (ty.childType(zcu).floatBits(self.target.*)) {
95059 .float => switch (ty.childType(zcu).floatBits(cg.target.*)) {
9189895060 16 => switch (ty.vectorLen(zcu)) {
91899 1...8 => return .{ .move = if (self.hasFeature(.avx))
95061 1...8 => return .{ .load_store = if (cg.hasFeature(.avx))
9190095062 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91901 else if (self.hasFeature(.sse2))
95063 else if (cg.hasFeature(.sse2))
9190295064 .{ if (aligned) ._dqa else ._dqu, .mov }
9190395065 else
9190495066 .{ ._ps, if (aligned) .mova else .movu } },
91905 9...16 => if (self.hasFeature(.avx))
91906 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95067 9...16 => if (cg.hasFeature(.avx))
95068 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9190795069 else => {},
9190895070 },
9190995071 32 => switch (ty.vectorLen(zcu)) {
91910 1...4 => return .{ .move = if (self.hasFeature(.avx))
95072 1...4 => return .{ .load_store = if (cg.hasFeature(.avx))
9191195073 .{ .v_ps, if (aligned) .mova else .movu }
9191295074 else
9191395075 .{ ._ps, if (aligned) .mova else .movu } },
91914 5...8 => if (self.hasFeature(.avx))
91915 return .{ .move = .{ .v_ps, if (aligned) .mova else .movu } },
95076 5...8 => if (cg.hasFeature(.avx))
95077 return .{ .load_store = .{ .v_ps, if (aligned) .mova else .movu } },
9191695078 else => {},
9191795079 },
9191895080 64 => switch (ty.vectorLen(zcu)) {
91919 1...2 => return .{ .move = if (self.hasFeature(.avx))
95081 1...2 => return .{ .load_store = if (cg.hasFeature(.avx))
9192095082 .{ .v_pd, if (aligned) .mova else .movu }
91921 else if (self.hasFeature(.sse2))
95083 else if (cg.hasFeature(.sse2))
9192295084 .{ ._pd, if (aligned) .mova else .movu }
9192395085 else
9192495086 .{ ._ps, if (aligned) .mova else .movu } },
91925 3...4 => if (self.hasFeature(.avx))
91926 return .{ .move = .{ .v_pd, if (aligned) .mova else .movu } },
95087 3...4 => if (cg.hasFeature(.avx))
95088 return .{ .load_store = .{ .v_pd, if (aligned) .mova else .movu } },
9192795089 else => {},
9192895090 },
9192995091 80, 128 => switch (ty.vectorLen(zcu)) {
91930 1 => return .{ .move = if (self.hasFeature(.avx))
95092 1 => return .{ .load_store = if (cg.hasFeature(.avx))
9193195093 .{ if (aligned) .v_dqa else .v_dqu, .mov }
91932 else if (self.hasFeature(.sse2))
95094 else if (cg.hasFeature(.sse2))
9193395095 .{ if (aligned) ._dqa else ._dqu, .mov }
9193495096 else
9193595097 .{ ._ps, if (aligned) .mova else .movu } },
91936 2 => if (self.hasFeature(.avx))
91937 return .{ .move = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
95098 2 => if (cg.hasFeature(.avx))
95099 return .{ .load_store = .{ if (aligned) .v_dqa else .v_dqu, .mov } },
9193895100 else => {},
9193995101 },
9194095102 else => {},
......@@ -91944,7 +95106,7 @@ fn moveStrategy(self: *CodeGen, ty: Type, class: Register.Class, aligned: bool)
9194495106 },
9194595107 .ip, .cr, .dr => {},
9194695108 }
91947 return self.fail("TODO moveStrategy for {}", .{ty.fmt(pt)});
95109 return cg.fail("TODO moveStrategy for {}", .{ty.fmt(pt)});
9194895110}
9194995111
9195095112const CopyOptions = struct {
......@@ -92332,7 +95494,7 @@ fn genSetReg(
9233295494 .size = 16,
9233395495 .alignment = .@"16",
9233495496 }));
92335 try MoveStrategy.write(.x87_load_store, self, .{
95497 try MoveStrategy.write(.load_store_x87, self, .{
9233695498 .base = .{ .frame = frame_index },
9233795499 .mod = .{ .rm = .{ .size = .tbyte } },
9233895500 }, src_reg);
......@@ -92430,7 +95592,7 @@ fn genSetReg(
9243095592 => try @as(MoveStrategy, switch (src_mcv) {
9243195593 .register_offset => |reg_off| switch (reg_off.off) {
9243295594 0 => return self.genSetReg(dst_reg, ty, .{ .register = reg_off.reg }, opts),
92433 else => .{ .move = .{ ._, .lea } },
95595 else => .{ .load_store = .{ ._, .lea } },
9243495596 },
9243595597 .indirect => try self.moveStrategy(ty, dst_reg.class(), false),
9243695598 .load_frame => |frame_addr| try self.moveStrategy(
......@@ -92440,7 +95602,7 @@ fn genSetReg(
9244095602 std.math.log2_int_ceil(u10, @divExact(dst_reg.bitSize(), 8)),
9244195603 )),
9244295604 ),
92443 .lea_frame => .{ .move = .{ ._, .lea } },
95605 .lea_frame => .{ .load_store = .{ ._, .lea } },
9244495606 else => unreachable,
9244595607 }).read(self, dst_alias, switch (src_mcv) {
9244695608 .register_offset, .indirect => |reg_off| .{
......@@ -100903,7 +104065,10 @@ const Select = struct {
100903104065 f64_0x1p52_0x1p84_mem,
100904104066 u32_0x1p52_hi_0x1p84_hi_0_0_mem,
100905104067 f32_0_0x1p64_mem,
100906 pshufb_cm_mem: struct { from: Memory.Size, to: Memory.Size },
104068 pshufb_trunc_mem: struct { from: Memory.Size, to: Memory.Size },
104069 pshufb_bswap_mem: struct { repeat: u4 = 1, size: Memory.Size, smear: u4 = 1 },
104070 forward_bits,
104071 reverse_bits,
100907104072 frame: FrameIndex,
100908104073 lazy_symbol: struct { kind: link.File.LazySymbol.Kind, ref: Select.Operand.Ref = .none },
100909104074 symbol: *const struct { lib: ?[]const u8 = null, name: []const u8 },
......@@ -101115,10 +104280,13 @@ const Select = struct {
101115104280 (try pt.floatValue(.f32, @as(f32, 0x1p64))).toIntern(),
101116104281 } },
101117104282 } }))), true },
101118 .pshufb_cm_mem => |const_spec| {
104283 .pshufb_trunc_mem => |trunc_spec| {
104284 const zcu = pt.zcu;
104285 assert(spec.type.isVector(zcu));
104286 assert(spec.type.childType(zcu).toIntern() == .u8_type);
101119104287 var bytes: [16]u8 = @splat(1 << 7);
101120 const from_bytes: u32 = @intCast(@divExact(const_spec.from.bitSize(cg.target), 8));
101121 const to_bytes: u32 = @intCast(@divExact(const_spec.to.bitSize(cg.target), 8));
104288 const from_bytes: u32 = @intCast(@divExact(trunc_spec.from.bitSize(cg.target), 8));
104289 const to_bytes: u32 = @intCast(@divExact(trunc_spec.to.bitSize(cg.target), 8));
101122104290 var from_index: u32 = 0;
101123104291 var to_index: u32 = 0;
101124104292 while (from_index < bytes.len) {
......@@ -101126,10 +104294,43 @@ const Select = struct {
101126104294 from_index += from_bytes;
101127104295 to_index += to_bytes;
101128104296 }
104297 const elems = bytes[0..spec.type.vectorLen(zcu)];
104298 return .{ try cg.tempMemFromValue(.fromInterned(try pt.intern(.{ .aggregate = .{
104299 .ty = spec.type.toIntern(),
104300 .storage = .{ .bytes = try zcu.intern_pool.getOrPutString(zcu.gpa, pt.tid, elems, .maybe_embedded_nulls) },
104301 } }))), true };
104302 },
104303 .pshufb_bswap_mem => |bswap_spec| {
101129104304 const zcu = pt.zcu;
104305 assert(spec.type.isVector(zcu));
104306 assert(spec.type.childType(zcu).toIntern() == .u8_type);
104307 var bytes: [32]u8 = @splat(1 << 7);
104308 const len: usize = @intCast(@divExact(bswap_spec.size.bitSize(cg.target), 8));
104309 var to_index: u32 = 0;
104310 for (0..bswap_spec.repeat) |_| for (0..len) |from_index| {
104311 @memset(bytes[to_index..][0..bswap_spec.smear], @intCast(len - 1 - from_index));
104312 to_index += bswap_spec.smear;
104313 };
104314 const elems = bytes[0..spec.type.vectorLen(zcu)];
104315 return .{ try cg.tempMemFromValue(.fromInterned(try pt.intern(.{ .aggregate = .{
104316 .ty = spec.type.toIntern(),
104317 .storage = .{ .bytes = try zcu.intern_pool.getOrPutString(zcu.gpa, pt.tid, elems, .maybe_embedded_nulls) },
104318 } }))), true };
104319 },
104320 .forward_bits, .reverse_bits => {
104321 const zcu = pt.zcu;
104322 assert(spec.type.isVector(zcu));
104323 assert(spec.type.childType(zcu).toIntern() == .u8_type);
104324 var bytes: [32]u8 = undefined;
104325 const elems = bytes[0..spec.type.vectorLen(zcu)];
104326 for (elems, 0..) |*elem, index| elem.* = switch (spec.kind) {
104327 else => unreachable,
104328 .forward_bits => @as(u8, 1 << 0) << @truncate(index),
104329 .reverse_bits => @as(u8, 1 << 7) >> @truncate(index),
104330 };
101130104331 return .{ try cg.tempMemFromValue(.fromInterned(try pt.intern(.{ .aggregate = .{
101131 .ty = (try pt.vectorType(.{ .len = bytes.len, .child = .u8_type })).toIntern(),
101132 .storage = .{ .bytes = try zcu.intern_pool.getOrPutString(zcu.gpa, pt.tid, &bytes, .maybe_embedded_nulls) },
104332 .ty = spec.type.toIntern(),
104333 .storage = .{ .bytes = try zcu.intern_pool.getOrPutString(zcu.gpa, pt.tid, elems, .maybe_embedded_nulls) },
101133104334 } }))), true };
101134104335 },
101135104336 .frame => |frame_index| .{ try cg.tempInit(spec.type, .{ .load_frame = .{ .index = frame_index } }), true },
......@@ -102013,9 +105214,10 @@ const Select = struct {
102013105214 .div_8_down => lhs >> 3 & @as(SignedImm, -1) << rhs,
102014105215 .rem_8_mul => lhs & (@as(SignedImm, 1) << @intCast(@as(u3, 3) + rhs)) - 1,
102015105216 };
105217 const disp: SignedImm = @bitCast(@as(UnsignedImm, @as(u32, @bitCast(op.imm))));
102016105218 return switch (op.flags.adjust.sign) {
102017 .neg => op.imm - op_res,
102018 .pos => op.imm + op_res,
105219 .neg => disp - op_res,
105220 .pos => disp + op_res,
102019105221 };
102020105222 }
102021105223
test/behavior/x86_64/build.zig+11-1
......@@ -55,6 +55,11 @@ pub fn build(b: *std.Build) void {
5555 .cpu_arch = .x86_64,
5656 .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
5757 },
58 .{
59 .cpu_arch = .x86_64,
60 .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
61 .cpu_features_add = std.Target.x86.featureSet(&.{ .adx, .gfni }),
62 },
5863 .{
5964 .cpu_arch = .x86_64,
6065 .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
......@@ -79,6 +84,11 @@ pub fn build(b: *std.Build) void {
7984 .cpu_arch = .x86_64,
8085 .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
8186 },
87 .{
88 .cpu_arch = .x86_64,
89 .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
90 .cpu_features_add = std.Target.x86.featureSet(&.{ .adx, .gfni }),
91 },
8292 .{
8393 .cpu_arch = .x86_64,
8494 .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
......@@ -96,7 +106,7 @@ pub fn build(b: *std.Build) void {
96106 .{
97107 .cpu_arch = .x86_64,
98108 .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v3 },
99 .cpu_features_add = std.Target.x86.featureSet(&.{.adx}),
109 .cpu_features_add = std.Target.x86.featureSet(&.{ .adx, .gfni }),
100110 },
101111 .{
102112 .cpu_arch = .x86_64,
test/behavior/x86_64/math.zig+35
......@@ -672,6 +672,33 @@ fn unary(comptime op: anytype, comptime opts: struct {
672672 try testArgs(u257, 1 << 255);
673673 try testArgs(u257, 1 << 256);
674674
675 try testArgs(i383, -1 << 382);
676 try testArgs(i383, -1);
677 try testArgs(i383, 0);
678 try testArgs(u383, 0);
679 try testArgs(u383, 1 << 0);
680 try testArgs(u383, 1 << 1);
681 try testArgs(u383, 1 << 381);
682 try testArgs(u383, 1 << 382);
683
684 try testArgs(i384, -1 << 383);
685 try testArgs(i384, -1);
686 try testArgs(i384, 0);
687 try testArgs(u384, 0);
688 try testArgs(u384, 1 << 0);
689 try testArgs(u384, 1 << 1);
690 try testArgs(u384, 1 << 382);
691 try testArgs(u384, 1 << 383);
692
693 try testArgs(i385, -1 << 384);
694 try testArgs(i385, -1);
695 try testArgs(i385, 0);
696 try testArgs(u385, 0);
697 try testArgs(u385, 1 << 0);
698 try testArgs(u385, 1 << 1);
699 try testArgs(u385, 1 << 383);
700 try testArgs(u385, 1 << 384);
701
675702 try testArgs(i511, -1 << 510);
676703 try testArgs(i511, -1);
677704 try testArgs(i511, 0);
......@@ -19297,6 +19324,14 @@ test byteSwap {
1929719324 try test_byte_swap.testInts();
1929819325}
1929919326
19327inline fn bitReverse(comptime Type: type, rhs: Type) @TypeOf(@bitReverse(rhs)) {
19328 return @bitReverse(rhs);
19329}
19330test bitReverse {
19331 const test_bit_reverse = unary(bitReverse, .{});
19332 try test_bit_reverse.testInts();
19333}
19334
1930019335inline fn sqrt(comptime Type: type, rhs: Type) @TypeOf(@sqrt(rhs)) {
1930119336 return @sqrt(rhs);
1930219337}