authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-10 01:55:25-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-05-17 02:08:41-04:00
log6dbf1c7682f446d5684fbfafd5274361ac6b64cf
tree816129883fab4116c79d1a138b4e1d1248835f03
parent932298679fdcefd1e4329e90697d91ae77fa0e21

x86_64: rewrite scalar `+|`


3 files changed, 1869 insertions(+), 3 deletions(-)

src/arch/x86_64/CodeGen.zig+1860-2
...@@ -2408,7 +2408,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2408,7 +2408,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2408}2408}
24092409
2410fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {2410fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2411 @setEvalBranchQuota(15_800);2411 @setEvalBranchQuota(15_900);
2412 const pt = cg.pt;2412 const pt = cg.pt;
2413 const zcu = pt.zcu;2413 const zcu = pt.zcu;
2414 const ip = &zcu.intern_pool;2414 const ip = &zcu.intern_pool;
...@@ -2444,7 +2444,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2444,7 +2444,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2444 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);2444 try cg.inst_tracking.ensureUnusedCapacity(cg.gpa, 1);
2445 switch (air_tags[@intFromEnum(inst)]) {2445 switch (air_tags[@intFromEnum(inst)]) {
2446 // zig fmt: off2446 // zig fmt: off
2447 .add_sat => try cg.airAddSat(inst),
2448 .sub_sat => try cg.airSubSat(inst),2447 .sub_sat => try cg.airSubSat(inst),
2449 .mul_sat => try cg.airMulSat(inst),2448 .mul_sat => try cg.airMulSat(inst),
2450 .shl_sat => try cg.airShlSat(inst),2449 .shl_sat => try cg.airShlSat(inst),
...@@ -4346,6 +4345,1864 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -4346,6 +4345,1864 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
4346 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);4345 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
4347 },4346 },
4348 .add_safe => unreachable,4347 .add_safe => unreachable,
4348 .add_sat => |air_tag| if (use_old) try cg.airAddSat(inst) else fallback: {
4349 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
4350 if (cg.typeOf(bin_op.lhs).isVector(zcu)) break :fallback try cg.airAddSat(inst);
4351 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
4352 var res: [1]Temp = undefined;
4353 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
4354 .required_features = .{ .cmov, null, null, null },
4355 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any },
4356 .patterns = &.{
4357 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4358 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4359 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4360 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4361 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4362 },
4363 .extra_temps = .{
4364 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
4365 .unused,
4366 .unused,
4367 .unused,
4368 .unused,
4369 .unused,
4370 .unused,
4371 .unused,
4372 .unused,
4373 .unused,
4374 .unused,
4375 },
4376 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4377 .clobbers = .{ .eflags = true },
4378 .each = .{ .once = &.{
4379 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4380 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
4381 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
4382 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4383 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4384 } },
4385 }, .{
4386 .src_constraints = .{ .{ .exact_signed_int = 8 }, .{ .exact_signed_int = 8 }, .any },
4387 .patterns = &.{
4388 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4389 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4390 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4391 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4392 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4393 },
4394 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4395 .clobbers = .{ .eflags = true },
4396 .each = .{ .once = &.{
4397 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4398 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
4399 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
4400 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smin), ._, ._ },
4401 } },
4402 }, .{
4403 .required_features = .{ .cmov, null, null, null },
4404 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any },
4405 .patterns = &.{
4406 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4407 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4408 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4409 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4410 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4411 },
4412 .extra_temps = .{
4413 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
4414 .unused,
4415 .unused,
4416 .unused,
4417 .unused,
4418 .unused,
4419 .unused,
4420 .unused,
4421 .unused,
4422 .unused,
4423 .unused,
4424 },
4425 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4426 .clobbers = .{ .eflags = true },
4427 .each = .{ .once = &.{
4428 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4429 .{ ._, ._r, .sa, .tmp0b, .ui(7), ._, ._ },
4430 .{ ._, ._, .xor, .tmp0b, .sa(.src0, .add_smax), ._, ._ },
4431 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4432 .{ ._, ._, .@"test", .dst0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
4433 .{ ._, ._po, .cmov, .dst0d, .tmp0d, ._, ._ },
4434 } },
4435 }, .{
4436 .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any },
4437 .patterns = &.{
4438 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4439 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4440 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4441 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4442 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4443 },
4444 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4445 .clobbers = .{ .eflags = true },
4446 .each = .{ .once = &.{
4447 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4448 .{ ._, ._, .@"test", .dst0b, .sia(-1 << 7, .src0, .sub_smin), ._, ._ },
4449 .{ ._, ._pe, .j, .@"0f", ._, ._, ._ },
4450 .{ ._, ._r, .sa, .dst0b, .ui(7), ._, ._ },
4451 .{ ._, ._, .xor, .dst0b, .sa(.src0, .add_smax), ._, ._ },
4452 } },
4453 }, .{
4454 .src_constraints = .{ .{ .exact_unsigned_int = 8 }, .{ .exact_unsigned_int = 8 }, .any },
4455 .patterns = &.{
4456 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4457 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4458 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4459 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4460 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4461 },
4462 .extra_temps = .{
4463 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
4464 .unused,
4465 .unused,
4466 .unused,
4467 .unused,
4468 .unused,
4469 .unused,
4470 .unused,
4471 .unused,
4472 .unused,
4473 .unused,
4474 },
4475 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4476 .clobbers = .{ .eflags = true },
4477 .each = .{ .once = &.{
4478 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4479 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
4480 .{ ._, ._, .@"or", .dst0b, .tmp0b, ._, ._ },
4481 } },
4482 }, .{
4483 .required_features = .{ .cmov, null, null, null },
4484 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
4485 .patterns = &.{
4486 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4487 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4488 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4489 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4490 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4491 },
4492 .extra_temps = .{
4493 .{ .type = .u8, .kind = .{ .rc = .general_purpose } },
4494 .unused,
4495 .unused,
4496 .unused,
4497 .unused,
4498 .unused,
4499 .unused,
4500 .unused,
4501 .unused,
4502 .unused,
4503 .unused,
4504 },
4505 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4506 .clobbers = .{ .eflags = true },
4507 .each = .{ .once = &.{
4508 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4509 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
4510 .{ ._, ._, .cmp, .dst0b, .tmp0b, ._, ._ },
4511 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
4512 } },
4513 }, .{
4514 .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any },
4515 .patterns = &.{
4516 .{ .src = .{ .to_mut_gpr, .imm8, .none } },
4517 .{ .src = .{ .imm8, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4518 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4519 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4520 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4521 },
4522 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4523 .clobbers = .{ .eflags = true },
4524 .each = .{ .once = &.{
4525 .{ ._, ._, .add, .dst0b, .src1b, ._, ._ },
4526 .{ ._, ._, .cmp, .dst0b, .ua(.src0, .add_umax), ._, ._ },
4527 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
4528 .{ ._, ._, .mov, .dst0b, .ua(.src0, .add_umax), ._, ._ },
4529 } },
4530 }, .{
4531 .required_features = .{ .fast_imm16, .cmov, null, null },
4532 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
4533 .patterns = &.{
4534 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4535 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4536 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4537 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4538 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4539 },
4540 .extra_temps = .{
4541 .{ .type = .i8, .kind = .{ .rc = .general_purpose } },
4542 .unused,
4543 .unused,
4544 .unused,
4545 .unused,
4546 .unused,
4547 .unused,
4548 .unused,
4549 .unused,
4550 .unused,
4551 .unused,
4552 },
4553 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4554 .clobbers = .{ .eflags = true },
4555 .each = .{ .once = &.{
4556 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4557 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4558 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
4559 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4560 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4561 } },
4562 }, .{
4563 .required_features = .{ .cmov, null, null, null },
4564 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
4565 .patterns = &.{
4566 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4567 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4568 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4569 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4570 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4571 },
4572 .extra_temps = .{
4573 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4574 .unused,
4575 .unused,
4576 .unused,
4577 .unused,
4578 .unused,
4579 .unused,
4580 .unused,
4581 .unused,
4582 .unused,
4583 .unused,
4584 },
4585 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4586 .clobbers = .{ .eflags = true },
4587 .each = .{ .once = &.{
4588 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4589 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4590 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
4591 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4592 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4593 } },
4594 }, .{
4595 .required_features = .{ .fast_imm16, null, null, null },
4596 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
4597 .patterns = &.{
4598 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4599 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4600 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4601 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4602 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4603 },
4604 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4605 .clobbers = .{ .eflags = true },
4606 .each = .{ .once = &.{
4607 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4608 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
4609 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
4610 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smin), ._, ._ },
4611 } },
4612 }, .{
4613 .src_constraints = .{ .{ .exact_signed_int = 16 }, .{ .exact_signed_int = 16 }, .any },
4614 .patterns = &.{
4615 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4616 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4617 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4618 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4619 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4620 },
4621 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4622 .clobbers = .{ .eflags = true },
4623 .each = .{ .once = &.{
4624 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4625 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
4626 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
4627 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
4628 } },
4629 }, .{
4630 .required_features = .{ .fast_imm16, .cmov, null, null },
4631 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4632 .patterns = &.{
4633 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4634 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4635 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4636 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4637 },
4638 .extra_temps = .{
4639 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4640 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4641 .unused,
4642 .unused,
4643 .unused,
4644 .unused,
4645 .unused,
4646 .unused,
4647 .unused,
4648 .unused,
4649 .unused,
4650 },
4651 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4652 .clobbers = .{ .eflags = true },
4653 .each = .{ .once = &.{
4654 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4655 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4656 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4657 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
4658 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
4659 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
4660 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4661 } },
4662 }, .{
4663 .required_features = .{ .fast_imm16, .cmov, null, null },
4664 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4665 .patterns = &.{
4666 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4667 },
4668 .extra_temps = .{
4669 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4670 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4671 .unused,
4672 .unused,
4673 .unused,
4674 .unused,
4675 .unused,
4676 .unused,
4677 .unused,
4678 .unused,
4679 .unused,
4680 },
4681 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4682 .clobbers = .{ .eflags = true },
4683 .each = .{ .once = &.{
4684 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4685 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4686 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4687 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
4688 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
4689 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
4690 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4691 } },
4692 }, .{
4693 .required_features = .{ .cmov, null, null, null },
4694 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4695 .patterns = &.{
4696 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4697 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4698 },
4699 .extra_temps = .{
4700 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4701 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4702 .unused,
4703 .unused,
4704 .unused,
4705 .unused,
4706 .unused,
4707 .unused,
4708 .unused,
4709 .unused,
4710 .unused,
4711 },
4712 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4713 .clobbers = .{ .eflags = true },
4714 .each = .{ .once = &.{
4715 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4716 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4717 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4718 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
4719 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
4720 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
4721 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4722 } },
4723 }, .{
4724 .required_features = .{ .cmov, null, null, null },
4725 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4726 .patterns = &.{
4727 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4728 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4729 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4730 },
4731 .extra_temps = .{
4732 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4733 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4734 .unused,
4735 .unused,
4736 .unused,
4737 .unused,
4738 .unused,
4739 .unused,
4740 .unused,
4741 .unused,
4742 .unused,
4743 },
4744 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4745 .clobbers = .{ .eflags = true },
4746 .each = .{ .once = &.{
4747 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4748 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4749 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4750 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
4751 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
4752 .{ ._, ._, .add, .tmp1w, .tmp1w, ._, ._ },
4753 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4754 } },
4755 }, .{
4756 .required_features = .{ .fast_imm16, null, null, null },
4757 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4758 .patterns = &.{
4759 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4760 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4761 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4762 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4763 },
4764 .extra_temps = .{
4765 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4766 .unused,
4767 .unused,
4768 .unused,
4769 .unused,
4770 .unused,
4771 .unused,
4772 .unused,
4773 .unused,
4774 .unused,
4775 .unused,
4776 },
4777 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4778 .clobbers = .{ .eflags = true },
4779 .each = .{ .once = &.{
4780 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4781 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4782 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
4783 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
4784 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
4785 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
4786 } },
4787 }, .{
4788 .required_features = .{ .fast_imm16, null, null, null },
4789 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4790 .patterns = &.{
4791 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4792 },
4793 .extra_temps = .{
4794 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4795 .unused,
4796 .unused,
4797 .unused,
4798 .unused,
4799 .unused,
4800 .unused,
4801 .unused,
4802 .unused,
4803 .unused,
4804 .unused,
4805 },
4806 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4807 .clobbers = .{ .eflags = true },
4808 .each = .{ .once = &.{
4809 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4810 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4811 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
4812 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
4813 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
4814 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
4815 } },
4816 }, .{
4817 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4818 .patterns = &.{
4819 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4820 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4821 },
4822 .extra_temps = .{
4823 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4824 .unused,
4825 .unused,
4826 .unused,
4827 .unused,
4828 .unused,
4829 .unused,
4830 .unused,
4831 .unused,
4832 .unused,
4833 .unused,
4834 },
4835 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4836 .clobbers = .{ .eflags = true },
4837 .each = .{ .once = &.{
4838 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4839 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4840 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
4841 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
4842 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
4843 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
4844 } },
4845 }, .{
4846 .src_constraints = .{ .{ .exact_signed_int = 15 }, .{ .exact_signed_int = 15 }, .any },
4847 .patterns = &.{
4848 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4849 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4850 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4851 },
4852 .extra_temps = .{
4853 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4854 .unused,
4855 .unused,
4856 .unused,
4857 .unused,
4858 .unused,
4859 .unused,
4860 .unused,
4861 .unused,
4862 .unused,
4863 .unused,
4864 },
4865 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4866 .clobbers = .{ .eflags = true },
4867 .each = .{ .once = &.{
4868 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4869 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4870 .{ ._, ._, .add, .tmp0w, .tmp0w, ._, ._ },
4871 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
4872 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
4873 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
4874 } },
4875 }, .{
4876 .required_features = .{ .fast_imm16, .cmov, null, null },
4877 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
4878 .patterns = &.{
4879 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4880 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4881 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4882 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4883 },
4884 .extra_temps = .{
4885 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4886 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4887 .unused,
4888 .unused,
4889 .unused,
4890 .unused,
4891 .unused,
4892 .unused,
4893 .unused,
4894 .unused,
4895 .unused,
4896 },
4897 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4898 .clobbers = .{ .eflags = true },
4899 .each = .{ .once = &.{
4900 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4901 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4902 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4903 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
4904 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
4905 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
4906 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
4907 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4908 } },
4909 }, .{
4910 .required_features = .{ .fast_imm16, .cmov, null, null },
4911 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
4912 .patterns = &.{
4913 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4914 },
4915 .extra_temps = .{
4916 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4917 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4918 .unused,
4919 .unused,
4920 .unused,
4921 .unused,
4922 .unused,
4923 .unused,
4924 .unused,
4925 .unused,
4926 .unused,
4927 },
4928 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4929 .clobbers = .{ .eflags = true },
4930 .each = .{ .once = &.{
4931 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4932 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4933 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4934 .{ ._, ._, .xor, .tmp0w, .sa(.src0, .add_smax), ._, ._ },
4935 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
4936 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
4937 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
4938 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4939 } },
4940 }, .{
4941 .required_features = .{ .cmov, null, null, null },
4942 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
4943 .patterns = &.{
4944 .{ .src = .{ .to_mut_gpr, .mem, .none } },
4945 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4946 },
4947 .extra_temps = .{
4948 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4949 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4950 .unused,
4951 .unused,
4952 .unused,
4953 .unused,
4954 .unused,
4955 .unused,
4956 .unused,
4957 .unused,
4958 .unused,
4959 },
4960 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4961 .clobbers = .{ .eflags = true },
4962 .each = .{ .once = &.{
4963 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4964 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4965 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
4966 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
4967 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
4968 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
4969 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
4970 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
4971 } },
4972 }, .{
4973 .required_features = .{ .cmov, null, null, null },
4974 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
4975 .patterns = &.{
4976 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
4977 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
4978 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
4979 },
4980 .extra_temps = .{
4981 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4982 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
4983 .unused,
4984 .unused,
4985 .unused,
4986 .unused,
4987 .unused,
4988 .unused,
4989 .unused,
4990 .unused,
4991 .unused,
4992 },
4993 .dst_temps = .{ .{ .ref = .src0 }, .unused },
4994 .clobbers = .{ .eflags = true },
4995 .each = .{ .once = &.{
4996 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
4997 .{ ._, ._r, .sa, .tmp0w, .ui(15), ._, ._ },
4998 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
4999 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
5000 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
5001 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
5002 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
5003 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
5004 } },
5005 }, .{
5006 .required_features = .{ .fast_imm16, null, null, null },
5007 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
5008 .patterns = &.{
5009 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
5010 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5011 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5012 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5013 },
5014 .extra_temps = .{
5015 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
5016 .unused,
5017 .unused,
5018 .unused,
5019 .unused,
5020 .unused,
5021 .unused,
5022 .unused,
5023 .unused,
5024 .unused,
5025 .unused,
5026 },
5027 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5028 .clobbers = .{ .eflags = true },
5029 .each = .{ .once = &.{
5030 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5031 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5032 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
5033 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
5034 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5035 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
5036 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
5037 } },
5038 }, .{
5039 .required_features = .{ .fast_imm16, null, null, null },
5040 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
5041 .patterns = &.{
5042 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5043 },
5044 .extra_temps = .{
5045 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
5046 .unused,
5047 .unused,
5048 .unused,
5049 .unused,
5050 .unused,
5051 .unused,
5052 .unused,
5053 .unused,
5054 .unused,
5055 .unused,
5056 },
5057 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5058 .clobbers = .{ .eflags = true },
5059 .each = .{ .once = &.{
5060 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5061 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5062 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
5063 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
5064 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5065 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
5066 .{ ._, ._, .xor, .dst0w, .sa(.src0, .add_smax), ._, ._ },
5067 } },
5068 }, .{
5069 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
5070 .patterns = &.{
5071 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5072 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5073 },
5074 .extra_temps = .{
5075 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
5076 .unused,
5077 .unused,
5078 .unused,
5079 .unused,
5080 .unused,
5081 .unused,
5082 .unused,
5083 .unused,
5084 .unused,
5085 .unused,
5086 },
5087 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5088 .clobbers = .{ .eflags = true },
5089 .each = .{ .once = &.{
5090 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5091 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5092 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
5093 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
5094 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5095 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
5096 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
5097 } },
5098 }, .{
5099 .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any },
5100 .patterns = &.{
5101 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
5102 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5103 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5104 },
5105 .extra_temps = .{
5106 .{ .type = .i16, .kind = .{ .rc = .general_purpose } },
5107 .unused,
5108 .unused,
5109 .unused,
5110 .unused,
5111 .unused,
5112 .unused,
5113 .unused,
5114 .unused,
5115 .unused,
5116 .unused,
5117 },
5118 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5119 .clobbers = .{ .eflags = true },
5120 .each = .{ .once = &.{
5121 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5122 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5123 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
5124 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
5125 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5126 .{ ._, ._r, .sa, .dst0w, .ui(15), ._, ._ },
5127 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
5128 } },
5129 }, .{
5130 .src_constraints = .{ .{ .exact_unsigned_int = 16 }, .{ .exact_unsigned_int = 16 }, .any },
5131 .patterns = &.{
5132 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
5133 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5134 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5135 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5136 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5137 },
5138 .extra_temps = .{
5139 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
5140 .unused,
5141 .unused,
5142 .unused,
5143 .unused,
5144 .unused,
5145 .unused,
5146 .unused,
5147 .unused,
5148 .unused,
5149 .unused,
5150 },
5151 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5152 .clobbers = .{ .eflags = true },
5153 .each = .{ .once = &.{
5154 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5155 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
5156 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
5157 } },
5158 }, .{
5159 .required_features = .{ .cmov, null, null, null },
5160 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
5161 .patterns = &.{
5162 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5163 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5164 },
5165 .extra_temps = .{
5166 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
5167 .unused,
5168 .unused,
5169 .unused,
5170 .unused,
5171 .unused,
5172 .unused,
5173 .unused,
5174 .unused,
5175 .unused,
5176 .unused,
5177 },
5178 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5179 .clobbers = .{ .eflags = true },
5180 .each = .{ .once = &.{
5181 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5182 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
5183 .{ ._, ._, .cmp, .dst0w, .tmp0w, ._, ._ },
5184 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
5185 } },
5186 }, .{
5187 .required_features = .{ .cmov, null, null, null },
5188 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
5189 .patterns = &.{
5190 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
5191 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5192 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5193 },
5194 .extra_temps = .{
5195 .{ .type = .u16, .kind = .{ .rc = .general_purpose } },
5196 .unused,
5197 .unused,
5198 .unused,
5199 .unused,
5200 .unused,
5201 .unused,
5202 .unused,
5203 .unused,
5204 .unused,
5205 .unused,
5206 },
5207 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5208 .clobbers = .{ .eflags = true },
5209 .each = .{ .once = &.{
5210 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5211 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
5212 .{ ._, ._, .cmp, .dst0w, .tmp0w, ._, ._ },
5213 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
5214 } },
5215 }, .{
5216 .required_features = .{ .fast_imm16, null, null, null },
5217 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
5218 .patterns = &.{
5219 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5220 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5221 },
5222 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5223 .clobbers = .{ .eflags = true },
5224 .each = .{ .once = &.{
5225 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5226 .{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
5227 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
5228 .{ ._, ._, .mov, .dst0w, .ua(.src0, .add_umax), ._, ._ },
5229 } },
5230 }, .{
5231 .required_features = .{ .fast_imm16, null, null, null },
5232 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
5233 .patterns = &.{
5234 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
5235 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5236 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5237 },
5238 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5239 .clobbers = .{ .eflags = true },
5240 .each = .{ .once = &.{
5241 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5242 .{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
5243 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
5244 .{ ._, ._, .mov, .dst0w, .ua(.src0, .add_umax), ._, ._ },
5245 } },
5246 }, .{
5247 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
5248 .patterns = &.{
5249 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5250 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5251 },
5252 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5253 .clobbers = .{ .eflags = true },
5254 .each = .{ .once = &.{
5255 .{ ._, ._, .add, .dst0w, .src1w, ._, ._ },
5256 .{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
5257 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
5258 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
5259 } },
5260 }, .{
5261 .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any },
5262 .patterns = &.{
5263 .{ .src = .{ .to_mut_gpr, .imm16, .none } },
5264 .{ .src = .{ .imm16, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5265 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5266 },
5267 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5268 .clobbers = .{ .eflags = true },
5269 .each = .{ .once = &.{
5270 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5271 .{ ._, ._, .cmp, .dst0w, .ua(.src0, .add_umax), ._, ._ },
5272 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
5273 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
5274 } },
5275 }, .{
5276 .required_features = .{ .cmov, null, null, null },
5277 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
5278 .patterns = &.{
5279 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5280 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5281 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5282 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5283 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5284 },
5285 .extra_temps = .{
5286 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
5287 .unused,
5288 .unused,
5289 .unused,
5290 .unused,
5291 .unused,
5292 .unused,
5293 .unused,
5294 .unused,
5295 .unused,
5296 .unused,
5297 },
5298 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5299 .clobbers = .{ .eflags = true },
5300 .each = .{ .once = &.{
5301 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5302 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
5303 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
5304 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5305 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
5306 } },
5307 }, .{
5308 .src_constraints = .{ .{ .exact_signed_int = 32 }, .{ .exact_signed_int = 32 }, .any },
5309 .patterns = &.{
5310 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5311 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5312 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5313 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5314 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5315 },
5316 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5317 .clobbers = .{ .eflags = true },
5318 .each = .{ .once = &.{
5319 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5320 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5321 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
5322 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smin), ._, ._ },
5323 } },
5324 }, .{
5325 .required_features = .{ .cmov, null, null, null },
5326 .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any },
5327 .patterns = &.{
5328 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5329 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5330 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5331 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5332 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5333 },
5334 .extra_temps = .{
5335 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
5336 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
5337 .unused,
5338 .unused,
5339 .unused,
5340 .unused,
5341 .unused,
5342 .unused,
5343 .unused,
5344 .unused,
5345 .unused,
5346 },
5347 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5348 .clobbers = .{ .eflags = true },
5349 .each = .{ .once = &.{
5350 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5351 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
5352 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5353 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
5354 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
5355 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
5356 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
5357 } },
5358 }, .{
5359 .src_constraints = .{ .{ .exact_signed_int = 31 }, .{ .exact_signed_int = 31 }, .any },
5360 .patterns = &.{
5361 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5362 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5363 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5364 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5365 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5366 },
5367 .extra_temps = .{
5368 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
5369 .unused,
5370 .unused,
5371 .unused,
5372 .unused,
5373 .unused,
5374 .unused,
5375 .unused,
5376 .unused,
5377 .unused,
5378 .unused,
5379 },
5380 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5381 .clobbers = .{ .eflags = true },
5382 .each = .{ .once = &.{
5383 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5384 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5385 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
5386 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5387 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
5388 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
5389 } },
5390 }, .{
5391 .required_features = .{ .cmov, null, null, null },
5392 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
5393 .patterns = &.{
5394 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5395 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5396 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5397 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5398 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5399 },
5400 .extra_temps = .{
5401 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
5402 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
5403 .unused,
5404 .unused,
5405 .unused,
5406 .unused,
5407 .unused,
5408 .unused,
5409 .unused,
5410 .unused,
5411 .unused,
5412 },
5413 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5414 .clobbers = .{ .eflags = true },
5415 .each = .{ .once = &.{
5416 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5417 .{ ._, ._r, .sa, .tmp0d, .ui(31), ._, ._ },
5418 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5419 .{ ._, ._, .xor, .tmp0d, .sa(.src0, .add_smax), ._, ._ },
5420 .{ ._, ._, .mov, .tmp1d, .dst0d, ._, ._ },
5421 .{ ._, ._l, .sa, .tmp1d, .uia(31, .src0, .sub_bit_size), ._, ._ },
5422 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
5423 .{ ._, ._o, .cmov, .dst0d, .tmp0d, ._, ._ },
5424 } },
5425 }, .{
5426 .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any },
5427 .patterns = &.{
5428 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5429 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5430 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5431 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5432 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5433 },
5434 .extra_temps = .{
5435 .{ .type = .i32, .kind = .{ .rc = .general_purpose } },
5436 .unused,
5437 .unused,
5438 .unused,
5439 .unused,
5440 .unused,
5441 .unused,
5442 .unused,
5443 .unused,
5444 .unused,
5445 .unused,
5446 },
5447 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5448 .clobbers = .{ .eflags = true },
5449 .each = .{ .once = &.{
5450 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5451 .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ },
5452 .{ ._, ._l, .sa, .tmp0d, .uia(31, .src0, .sub_bit_size), ._, ._ },
5453 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
5454 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5455 .{ ._, ._r, .sa, .dst0d, .ui(31), ._, ._ },
5456 .{ ._, ._, .xor, .dst0d, .sa(.src0, .add_smax), ._, ._ },
5457 } },
5458 }, .{
5459 .src_constraints = .{ .{ .exact_unsigned_int = 32 }, .{ .exact_unsigned_int = 32 }, .any },
5460 .patterns = &.{
5461 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5462 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5463 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5464 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5465 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5466 },
5467 .extra_temps = .{
5468 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
5469 .unused,
5470 .unused,
5471 .unused,
5472 .unused,
5473 .unused,
5474 .unused,
5475 .unused,
5476 .unused,
5477 .unused,
5478 .unused,
5479 },
5480 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5481 .clobbers = .{ .eflags = true },
5482 .each = .{ .once = &.{
5483 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5484 .{ ._, ._, .sbb, .tmp0d, .tmp0d, ._, ._ },
5485 .{ ._, ._, .@"or", .dst0d, .tmp0d, ._, ._ },
5486 } },
5487 }, .{
5488 .required_features = .{ .cmov, null, null, null },
5489 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
5490 .patterns = &.{
5491 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5492 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5493 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5494 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5495 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5496 },
5497 .extra_temps = .{
5498 .{ .type = .u32, .kind = .{ .rc = .general_purpose } },
5499 .unused,
5500 .unused,
5501 .unused,
5502 .unused,
5503 .unused,
5504 .unused,
5505 .unused,
5506 .unused,
5507 .unused,
5508 .unused,
5509 },
5510 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5511 .clobbers = .{ .eflags = true },
5512 .each = .{ .once = &.{
5513 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5514 .{ ._, ._, .mov, .tmp0d, .ua(.src0, .add_umax), ._, ._ },
5515 .{ ._, ._, .cmp, .dst0d, .tmp0d, ._, ._ },
5516 .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ },
5517 } },
5518 }, .{
5519 .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any },
5520 .patterns = &.{
5521 .{ .src = .{ .to_mut_gpr, .imm32, .none } },
5522 .{ .src = .{ .imm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5523 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5524 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5525 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5526 },
5527 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5528 .clobbers = .{ .eflags = true },
5529 .each = .{ .once = &.{
5530 .{ ._, ._, .add, .dst0d, .src1d, ._, ._ },
5531 .{ ._, ._, .cmp, .dst0d, .ua(.src0, .add_umax), ._, ._ },
5532 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
5533 .{ ._, ._, .mov, .dst0d, .ua(.src0, .add_umax), ._, ._ },
5534 } },
5535 }, .{
5536 .required_features = .{ .@"64bit", .cmov, null, null },
5537 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
5538 .patterns = &.{
5539 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5540 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5541 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5542 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5543 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5544 },
5545 .extra_temps = .{
5546 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5547 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5548 .unused,
5549 .unused,
5550 .unused,
5551 .unused,
5552 .unused,
5553 .unused,
5554 .unused,
5555 .unused,
5556 .unused,
5557 },
5558 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5559 .clobbers = .{ .eflags = true },
5560 .each = .{ .once = &.{
5561 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5562 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
5563 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
5564 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
5565 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5566 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
5567 } },
5568 }, .{
5569 .required_features = .{ .@"64bit", null, null, null },
5570 .src_constraints = .{ .{ .exact_signed_int = 64 }, .{ .exact_signed_int = 64 }, .any },
5571 .patterns = &.{
5572 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5573 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5574 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5575 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5576 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5577 },
5578 .extra_temps = .{
5579 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5580 .unused,
5581 .unused,
5582 .unused,
5583 .unused,
5584 .unused,
5585 .unused,
5586 .unused,
5587 .unused,
5588 .unused,
5589 .unused,
5590 },
5591 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5592 .clobbers = .{ .eflags = true },
5593 .each = .{ .once = &.{
5594 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5595 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5596 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
5597 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smin), ._, ._ },
5598 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
5599 } },
5600 }, .{
5601 .required_features = .{ .@"64bit", .cmov, null, null },
5602 .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any },
5603 .patterns = &.{
5604 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5605 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5606 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5607 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5608 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5609 },
5610 .extra_temps = .{
5611 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5612 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5613 .unused,
5614 .unused,
5615 .unused,
5616 .unused,
5617 .unused,
5618 .unused,
5619 .unused,
5620 .unused,
5621 .unused,
5622 },
5623 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5624 .clobbers = .{ .eflags = true },
5625 .each = .{ .once = &.{
5626 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5627 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
5628 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5629 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
5630 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
5631 .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ },
5632 .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
5633 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
5634 } },
5635 }, .{
5636 .required_features = .{ .@"64bit", null, null, null },
5637 .src_constraints = .{ .{ .exact_signed_int = 63 }, .{ .exact_signed_int = 63 }, .any },
5638 .patterns = &.{
5639 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5640 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5641 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5642 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5643 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5644 },
5645 .extra_temps = .{
5646 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5647 .unused,
5648 .unused,
5649 .unused,
5650 .unused,
5651 .unused,
5652 .unused,
5653 .unused,
5654 .unused,
5655 .unused,
5656 .unused,
5657 },
5658 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5659 .clobbers = .{ .eflags = true },
5660 .each = .{ .once = &.{
5661 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5662 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5663 .{ ._, ._, .add, .tmp0q, .tmp0q, ._, ._ },
5664 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5665 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
5666 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
5667 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
5668 } },
5669 }, .{
5670 .required_features = .{ .@"64bit", .cmov, null, null },
5671 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
5672 .patterns = &.{
5673 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5674 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5675 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5676 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5677 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5678 },
5679 .extra_temps = .{
5680 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5681 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5682 .unused,
5683 .unused,
5684 .unused,
5685 .unused,
5686 .unused,
5687 .unused,
5688 .unused,
5689 .unused,
5690 .unused,
5691 },
5692 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5693 .clobbers = .{ .eflags = true },
5694 .each = .{ .once = &.{
5695 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5696 .{ ._, ._r, .sa, .tmp0q, .ui(63), ._, ._ },
5697 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5698 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smax), ._, ._ },
5699 .{ ._, ._, .xor, .tmp0q, .tmp1q, ._, ._ },
5700 .{ ._, ._, .mov, .tmp1q, .dst0q, ._, ._ },
5701 .{ ._, ._r, .sh, .tmp1q, .sia(-31, .src0, .add_bit_size), ._, ._ },
5702 .{ ._, ._, .add, .tmp1d, .tmp1d, ._, ._ },
5703 .{ ._, ._o, .cmov, .dst0q, .tmp0q, ._, ._ },
5704 } },
5705 }, .{
5706 .required_features = .{ .@"64bit", null, null, null },
5707 .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any },
5708 .patterns = &.{
5709 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5710 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5711 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5712 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5713 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5714 },
5715 .extra_temps = .{
5716 .{ .type = .i64, .kind = .{ .rc = .general_purpose } },
5717 .unused,
5718 .unused,
5719 .unused,
5720 .unused,
5721 .unused,
5722 .unused,
5723 .unused,
5724 .unused,
5725 .unused,
5726 .unused,
5727 },
5728 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5729 .clobbers = .{ .eflags = true },
5730 .each = .{ .once = &.{
5731 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5732 .{ ._, ._, .mov, .tmp0q, .dst0q, ._, ._ },
5733 .{ ._, ._r, .sh, .tmp0q, .sia(-31, .src0, .add_bit_size), ._, ._ },
5734 .{ ._, ._, .add, .tmp0d, .tmp0d, ._, ._ },
5735 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5736 .{ ._, ._r, .sa, .dst0q, .ui(63), ._, ._ },
5737 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smax), ._, ._ },
5738 .{ ._, ._, .xor, .dst0q, .tmp0q, ._, ._ },
5739 } },
5740 }, .{
5741 .required_features = .{ .@"64bit", null, null, null },
5742 .src_constraints = .{ .{ .exact_unsigned_int = 64 }, .{ .exact_unsigned_int = 64 }, .any },
5743 .patterns = &.{
5744 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5745 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5746 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5747 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5748 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5749 },
5750 .extra_temps = .{
5751 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5752 .unused,
5753 .unused,
5754 .unused,
5755 .unused,
5756 .unused,
5757 .unused,
5758 .unused,
5759 .unused,
5760 .unused,
5761 .unused,
5762 },
5763 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5764 .clobbers = .{ .eflags = true },
5765 .each = .{ .once = &.{
5766 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5767 .{ ._, ._, .sbb, .tmp0q, .tmp0q, ._, ._ },
5768 .{ ._, ._, .@"or", .dst0q, .tmp0q, ._, ._ },
5769 } },
5770 }, .{
5771 .required_features = .{ .@"64bit", .cmov, null, null },
5772 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
5773 .patterns = &.{
5774 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5775 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5776 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5777 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5778 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5779 },
5780 .extra_temps = .{
5781 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5782 .unused,
5783 .unused,
5784 .unused,
5785 .unused,
5786 .unused,
5787 .unused,
5788 .unused,
5789 .unused,
5790 .unused,
5791 .unused,
5792 },
5793 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5794 .clobbers = .{ .eflags = true },
5795 .each = .{ .once = &.{
5796 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5797 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
5798 .{ ._, ._, .cmp, .dst0q, .tmp0q, ._, ._ },
5799 .{ ._, ._a, .cmov, .dst0q, .tmp0q, ._, ._ },
5800 } },
5801 }, .{
5802 .required_features = .{ .@"64bit", null, null, null },
5803 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
5804 .patterns = &.{
5805 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5806 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5807 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5808 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5809 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5810 },
5811 .extra_temps = .{
5812 .{ .type = .u64, .kind = .{ .rc = .general_purpose } },
5813 .unused,
5814 .unused,
5815 .unused,
5816 .unused,
5817 .unused,
5818 .unused,
5819 .unused,
5820 .unused,
5821 .unused,
5822 .unused,
5823 },
5824 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5825 .clobbers = .{ .eflags = true },
5826 .each = .{ .once = &.{
5827 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5828 .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_umax), ._, ._ },
5829 .{ ._, ._, .cmp, .dst0q, .tmp0q, ._, ._ },
5830 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
5831 .{ ._, ._, .mov, .dst0q, .tmp0q, ._, ._ },
5832 } },
5833 }, .{
5834 .required_features = .{ .@"64bit", null, null, null },
5835 .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any },
5836 .patterns = &.{
5837 .{ .src = .{ .to_mut_gpr, .simm32, .none } },
5838 .{ .src = .{ .simm32, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5839 .{ .src = .{ .to_mut_gpr, .mem, .none } },
5840 .{ .src = .{ .mem, .to_mut_gpr, .none }, .commute = .{ 0, 1 } },
5841 .{ .src = .{ .to_mut_gpr, .to_gpr, .none } },
5842 },
5843 .dst_temps = .{ .{ .ref = .src0 }, .unused },
5844 .clobbers = .{ .eflags = true },
5845 .each = .{ .once = &.{
5846 .{ ._, ._, .add, .dst0q, .src1q, ._, ._ },
5847 .{ ._, ._, .cmp, .dst0q, .ua(.src0, .add_umax), ._, ._ },
5848 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
5849 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
5850 } },
5851 }, .{
5852 .required_features = .{ .@"64bit", null, null, null },
5853 .src_constraints = .{
5854 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
5855 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .xword } },
5856 .any,
5857 },
5858 .patterns = &.{
5859 .{ .src = .{ .to_mem, .to_mem, .none } },
5860 },
5861 .extra_temps = .{
5862 .{ .type = .isize, .kind = .{ .reg = .rdi } },
5863 .{ .type = .i64, .kind = .{ .reg = .rax } },
5864 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5865 .unused,
5866 .unused,
5867 .unused,
5868 .unused,
5869 .unused,
5870 .unused,
5871 .unused,
5872 .unused,
5873 },
5874 .dst_temps = .{ .mem, .unused },
5875 .clobbers = .{ .eflags = true },
5876 .each = .{ .once = &.{
5877 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
5878 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5879 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5880 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
5881 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -8), .tmp1q, ._, ._ },
5882 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5883 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5884 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -8), ._, ._ },
5885 .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -8), ._, ._ },
5886 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5887 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
5888 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
5889 .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
5890 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
5891 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
5892 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
5893 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5894 } },
5895 }, .{
5896 .required_features = .{ .@"64bit", null, null, null },
5897 .src_constraints = .{
5898 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
5899 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
5900 .any,
5901 },
5902 .patterns = &.{
5903 .{ .src = .{ .to_mem, .to_mem, .none } },
5904 },
5905 .extra_temps = .{
5906 .{ .type = .isize, .kind = .{ .reg = .rdi } },
5907 .{ .type = .u64, .kind = .{ .reg = .rax } },
5908 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5909 .unused,
5910 .unused,
5911 .unused,
5912 .unused,
5913 .unused,
5914 .unused,
5915 .unused,
5916 .unused,
5917 },
5918 .dst_temps = .{ .mem, .unused },
5919 .clobbers = .{ .eflags = true },
5920 .each = .{ .once = &.{
5921 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
5922 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5923 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
5924 .{ ._, ._, .adc, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
5925 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp1q, ._, ._ },
5926 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5927 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5928 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
5929 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
5930 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
5931 .{ ._, ._, .mov, .tmp2d, .sa(.src0, .add_size_div_8), ._, ._ },
5932 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
5933 } },
5934 }, .{
5935 .required_features = .{ .@"64bit", null, null, null },
5936 .src_constraints = .{
5937 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
5938 .{ .exact_remainder_signed_int = .{ .of = .xword, .is = .qword } },
5939 .any,
5940 },
5941 .patterns = &.{
5942 .{ .src = .{ .to_mem, .to_mem, .none } },
5943 },
5944 .extra_temps = .{
5945 .{ .type = .isize, .kind = .{ .reg = .rdi } },
5946 .{ .type = .i64, .kind = .{ .reg = .rax } },
5947 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5948 .unused,
5949 .unused,
5950 .unused,
5951 .unused,
5952 .unused,
5953 .unused,
5954 .unused,
5955 .unused,
5956 },
5957 .dst_temps = .{ .mem, .unused },
5958 .clobbers = .{ .eflags = true },
5959 .each = .{ .once = &.{
5960 .{ ._, ._, .mov, .tmp0p, .sia(2, .src0, .sub_size_div_8), ._, ._ },
5961 .{ ._, ._c, .cl, ._, ._, ._, ._ },
5962 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -16), ._, ._ },
5963 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -16), ._, ._ },
5964 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -16), .tmp1q, ._, ._ },
5965 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
5966 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
5967 .{ ._, ._, .mov, .tmp1q, .memad(.src0q, .add_size, -16), ._, ._ },
5968 .{ ._, ._, .adc, .tmp1q, .memad(.src1q, .add_size, -16), ._, ._ },
5969 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
5970 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
5971 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
5972 .{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
5973 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
5974 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
5975 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
5976 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
5977 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
5978 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
5979 } },
5980 }, .{
5981 .required_features = .{ .@"64bit", null, null, null },
5982 .src_constraints = .{
5983 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
5984 .{ .exact_remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
5985 .any,
5986 },
5987 .patterns = &.{
5988 .{ .src = .{ .to_mem, .to_mem, .none } },
5989 },
5990 .extra_temps = .{
5991 .{ .type = .isize, .kind = .{ .reg = .rdi } },
5992 .{ .type = .u64, .kind = .{ .reg = .rax } },
5993 .{ .type = .u64, .kind = .{ .reg = .rcx } },
5994 .unused,
5995 .unused,
5996 .unused,
5997 .unused,
5998 .unused,
5999 .unused,
6000 .unused,
6001 .unused,
6002 },
6003 .dst_temps = .{ .mem, .unused },
6004 .clobbers = .{ .eflags = true },
6005 .each = .{ .once = &.{
6006 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
6007 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6008 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
6009 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
6010 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -8), .tmp1q, ._, ._ },
6011 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6012 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6013 .{ ._, ._nc, .j, .@"0f", ._, ._, ._ },
6014 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
6015 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
6016 .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
6017 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
6018 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
6019 } },
6020 }, .{
6021 .required_features = .{ .@"64bit", null, null, null },
6022 .src_constraints = .{
6023 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
6024 .{ .remainder_signed_int = .{ .of = .xword, .is = .qword } },
6025 .any,
6026 },
6027 .patterns = &.{
6028 .{ .src = .{ .to_mem, .to_mem, .none } },
6029 },
6030 .extra_temps = .{
6031 .{ .type = .isize, .kind = .{ .reg = .rdi } },
6032 .{ .type = .i64, .kind = .{ .reg = .rax } },
6033 .{ .type = .u64, .kind = .{ .reg = .rcx } },
6034 .unused,
6035 .unused,
6036 .unused,
6037 .unused,
6038 .unused,
6039 .unused,
6040 .unused,
6041 .unused,
6042 },
6043 .dst_temps = .{ .mem, .unused },
6044 .clobbers = .{ .eflags = true },
6045 .each = .{ .once = &.{
6046 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
6047 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6048 .{ .@"0:", ._, .mov, .tmp1q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
6049 .{ ._, ._, .adc, .tmp1q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
6050 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -8), .tmp1q, ._, ._ },
6051 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6052 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6053 .{ ._, ._l, .sa, .tmp1q, .uia(63, .src0, .sub_bit_size_rem_64), ._, ._ },
6054 .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
6055 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
6056 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
6057 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
6058 .{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
6059 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
6060 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
6061 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
6062 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
6063 .{ .@"0:", ._r, .sa, .tmp1q, .ui(63), ._, ._ },
6064 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
6065 } },
6066 }, .{
6067 .required_features = .{ .@"64bit", null, null, null },
6068 .src_constraints = .{
6069 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
6070 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .qword } },
6071 .any,
6072 },
6073 .patterns = &.{
6074 .{ .src = .{ .to_mem, .to_mem, .none } },
6075 },
6076 .extra_temps = .{
6077 .{ .type = .isize, .kind = .{ .reg = .rdi } },
6078 .{ .type = .u64, .kind = .{ .reg = .rax } },
6079 .{ .type = .u64, .kind = .{ .reg = .rcx } },
6080 .unused,
6081 .unused,
6082 .unused,
6083 .unused,
6084 .unused,
6085 .unused,
6086 .unused,
6087 .unused,
6088 },
6089 .dst_temps = .{ .mem, .unused },
6090 .clobbers = .{ .eflags = true },
6091 .each = .{ .once = &.{
6092 .{ ._, ._, .mov, .tmp0p, .sia(1, .src0, .sub_size_div_8), ._, ._ },
6093 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
6094 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6095 .{ .@"0:", ._, .mov, .tmp2q, .memsiad(.src0q, .@"8", .tmp0, .add_size, -8), ._, ._ },
6096 .{ ._, ._, .adc, .tmp2q, .memsiad(.src1q, .@"8", .tmp0, .add_size, -8), ._, ._ },
6097 .{ ._, ._, .mov, .memsiad(.dst0q, .@"8", .tmp0, .add_size, -8), .tmp2q, ._, ._ },
6098 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6099 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6100 .{ ._, ._, .cmp, .tmp2q, .tmp1q, ._, ._ },
6101 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
6102 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -16), .tmp1q, ._, ._ },
6103 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
6104 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
6105 .{ ._, ._, .mov, .tmp2d, .sia(-2, .src0, .add_size_div_8), ._, ._ },
6106 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
6107 .{ .@"0:", ._, .mov, .memad(.dst0q, .add_size, -8), .si(0), ._, ._ },
6108 } },
6109 }, .{
6110 .required_features = .{ .@"64bit", null, null, null },
6111 .src_constraints = .{
6112 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
6113 .{ .remainder_signed_int = .{ .of = .xword, .is = .xword } },
6114 .any,
6115 },
6116 .patterns = &.{
6117 .{ .src = .{ .to_mem, .to_mem, .none } },
6118 },
6119 .extra_temps = .{
6120 .{ .type = .isize, .kind = .{ .reg = .rdi } },
6121 .{ .type = .i64, .kind = .{ .reg = .rax } },
6122 .{ .type = .u64, .kind = .{ .reg = .rcx } },
6123 .unused,
6124 .unused,
6125 .unused,
6126 .unused,
6127 .unused,
6128 .unused,
6129 .unused,
6130 .unused,
6131 },
6132 .dst_temps = .{ .mem, .unused },
6133 .clobbers = .{ .eflags = true },
6134 .each = .{ .once = &.{
6135 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
6136 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6137 .{ .@"0:", ._, .mov, .tmp1q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
6138 .{ ._, ._, .adc, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
6139 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp1q, ._, ._ },
6140 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6141 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6142 .{ ._, ._l, .sa, .tmp1q, .uia(63, .src0, .sub_bit_size_rem_64), ._, ._ },
6143 .{ ._, ._, .add, .tmp1q, .tmp1q, ._, ._ },
6144 .{ ._, ._no, .j, .@"0f", ._, ._, ._ },
6145 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
6146 .{ ._, ._r, .sa, .tmp1q, .ui(63), ._, ._ },
6147 .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
6148 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
6149 .{ ._, ._, .mov, .tmp2q, .ua(.src0, .add_smin), ._, ._ },
6150 .{ ._, ._, .xor, .tmp1q, .tmp2q, ._, ._ },
6151 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
6152 } },
6153 }, .{
6154 .required_features = .{ .@"64bit", null, null, null },
6155 .src_constraints = .{
6156 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
6157 .{ .remainder_unsigned_int = .{ .of = .xword, .is = .xword } },
6158 .any,
6159 },
6160 .patterns = &.{
6161 .{ .src = .{ .to_mem, .to_mem, .none } },
6162 },
6163 .extra_temps = .{
6164 .{ .type = .isize, .kind = .{ .reg = .rdi } },
6165 .{ .type = .u64, .kind = .{ .reg = .rax } },
6166 .{ .type = .u64, .kind = .{ .reg = .rcx } },
6167 .unused,
6168 .unused,
6169 .unused,
6170 .unused,
6171 .unused,
6172 .unused,
6173 .unused,
6174 .unused,
6175 },
6176 .dst_temps = .{ .mem, .unused },
6177 .clobbers = .{ .eflags = true },
6178 .each = .{ .once = &.{
6179 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size_div_8), ._, ._ },
6180 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
6181 .{ ._, ._c, .cl, ._, ._, ._, ._ },
6182 .{ .@"0:", ._, .mov, .tmp2q, .memsia(.src0q, .@"8", .tmp0, .add_size), ._, ._ },
6183 .{ ._, ._, .adc, .tmp2q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ },
6184 .{ ._, ._, .mov, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp2q, ._, ._ },
6185 .{ ._, ._c, .in, .tmp0p, ._, ._, ._ },
6186 .{ ._, ._nz, .j, .@"0b", ._, ._, ._ },
6187 .{ ._, ._, .cmp, .tmp2q, .tmp1q, ._, ._ },
6188 .{ ._, ._na, .j, .@"0f", ._, ._, ._ },
6189 .{ ._, ._, .mov, .memad(.dst0q, .add_size, -8), .tmp1q, ._, ._ },
6190 .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ },
6191 .{ ._, ._, .mov, .tmp1q, .si(-1), ._, ._ },
6192 .{ ._, ._, .mov, .tmp2d, .sia(-1, .src0, .add_size_div_8), ._, ._ },
6193 .{ ._, .@"rep _sq", .sto, ._, ._, ._, ._ },
6194 } },
6195 } }) catch |err| switch (err) {
6196 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
6197 @tagName(air_tag),
6198 cg.typeOf(bin_op.lhs).fmt(pt),
6199 ops[0].tracking(cg),
6200 ops[1].tracking(cg),
6201 }),
6202 else => |e| return e,
6203 };
6204 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
6205 },
4349 .sub, .sub_optimized, .sub_wrap => |air_tag| if (use_old) try cg.airBinOp(inst, switch (air_tag) {6206 .sub, .sub_optimized, .sub_wrap => |air_tag| if (use_old) try cg.airBinOp(inst, switch (air_tag) {
4350 else => unreachable,6207 else => unreachable,
4351 .sub, .sub_optimized => .sub,6208 .sub, .sub_optimized => .sub,
...@@ -119854,6 +121711,7 @@ const Select = struct {...@@ -119854,6 +121711,7 @@ const Select = struct {
119854 const add_elem_limbs: Adjust = .{ .sign = .pos, .lhs = .elem_limbs, .op = .mul, .rhs = .@"1" };121711 const add_elem_limbs: Adjust = .{ .sign = .pos, .lhs = .elem_limbs, .op = .mul, .rhs = .@"1" };
119855 const add_smin: Adjust = .{ .sign = .pos, .lhs = .smin, .op = .mul, .rhs = .@"1" };121712 const add_smin: Adjust = .{ .sign = .pos, .lhs = .smin, .op = .mul, .rhs = .@"1" };
119856 const sub_smin: Adjust = .{ .sign = .neg, .lhs = .smin, .op = .mul, .rhs = .@"1" };121713 const sub_smin: Adjust = .{ .sign = .neg, .lhs = .smin, .op = .mul, .rhs = .@"1" };
121714 const add_smax: Adjust = .{ .sign = .pos, .lhs = .smax, .op = .mul, .rhs = .@"1" };
119857 const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" };121715 const add_umax: Adjust = .{ .sign = .pos, .lhs = .umax, .op = .mul, .rhs = .@"1" };
119858 const sub_umax: Adjust = .{ .sign = .neg, .lhs = .umax, .op = .mul, .rhs = .@"1" };121716 const sub_umax: Adjust = .{ .sign = .neg, .lhs = .umax, .op = .mul, .rhs = .@"1" };
119859 const add_umax_shr_src1: Adjust = .{ .sign = .pos, .lhs = .umax_shr_src1, .op = .mul, .rhs = .@"1" };121717 const add_umax_shr_src1: Adjust = .{ .sign = .pos, .lhs = .umax_shr_src1, .op = .mul, .rhs = .@"1" };
test/behavior/saturating_arithmetic.zig+1-1
...@@ -53,12 +53,12 @@ test "saturating add" {...@@ -53,12 +53,12 @@ test "saturating add" {
5353
54test "saturating add 128bit" {54test "saturating add 128bit" {
55 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO55 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
56 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
57 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO56 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
58 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO57 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
59 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO58 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
60 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;59 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
61 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;60 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
61 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
6262
63 const S = struct {63 const S = struct {
64 fn doTheTest() !void {64 fn doTheTest() !void {
test/behavior/x86_64/binary.zig+8
...@@ -5282,6 +5282,14 @@ test addWrap {...@@ -5282,6 +5282,14 @@ test addWrap {
5282 try test_add_wrap.testIntVectors();5282 try test_add_wrap.testIntVectors();
5283}5283}
52845284
5285inline fn addSat(comptime Type: type, lhs: Type, rhs: Type) Type {
5286 return lhs +| rhs;
5287}
5288test addSat {
5289 const test_add_sat = binary(addSat, .{});
5290 try test_add_sat.testInts();
5291}
5292
5285inline fn subUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {5293inline fn subUnsafe(comptime Type: type, lhs: Type, rhs: Type) AddOneBit(Type) {
5286 @setRuntimeSafety(false);5294 @setRuntimeSafety(false);
5287 return switch (@typeInfo(Scalar(Type))) {5295 return switch (@typeInfo(Scalar(Type))) {