authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-26 09:05:04-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-26 09:51:07-05:00
log654da648b3af7cbc5e30b6dfec4d7515d047e99b
treef9e271c141e86888680eea72aed4afdc2f41f487
parent0c890bb9a4d6729b10d9f2ebd73269bcd5ac853b

x86_64: rewrite `@min`/`@max` for float vectors


2 files changed, 2429 insertions(+), 98 deletions(-)

src/arch/x86_64/CodeGen.zig+2037-98
......@@ -2393,7 +2393,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
23932393}
23942394
23952395fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2396 @setEvalBranchQuota(3_600);
2396 @setEvalBranchQuota(3_900);
23972397 const pt = cg.pt;
23982398 const zcu = pt.zcu;
23992399 const ip = &zcu.intern_pool;
......@@ -2805,10 +2805,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
28052805 }
28062806 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
28072807 },
2808 .max => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else fallback: {
2808 .max => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else {
28092809 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
2810 const ty = cg.typeOf(bin_op.lhs);
2811 if (ty.isVector(zcu) and cg.floatBits(ty.childType(zcu)) != null) break :fallback try cg.airBinOp(inst, air_tag);
28122810 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
28132811 var res: [1]Temp = undefined;
28142812 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
......@@ -4510,7 +4508,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
45104508 },
45114509 .extra_temps = .{
45124510 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4513 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
4511 .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
45144512 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
45154513 .unused,
45164514 .unused,
......@@ -4647,7 +4645,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
46474645 },
46484646 .extra_temps = .{
46494647 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
4650 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
4648 .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
46514649 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
46524650 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
46534651 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
......@@ -4967,7 +4965,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
49674965 },
49684966 .extra_temps = .{
49694967 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
4970 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
4968 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
49714969 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
49724970 .unused,
49734971 .unused,
......@@ -4998,7 +4996,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
49984996 },
49994997 .extra_temps = .{
50004998 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5001 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
4999 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
50025000 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
50035001 .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } },
50045002 .unused,
......@@ -5030,7 +5028,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50305028 },
50315029 .extra_temps = .{
50325030 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
5033 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5031 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
50345032 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
50355033 .unused,
50365034 .unused,
......@@ -5059,7 +5057,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50595057 },
50605058 .extra_temps = .{
50615059 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5062 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5060 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
50635061 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
50645062 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
50655063 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
......@@ -5095,7 +5093,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
50955093 },
50965094 .extra_temps = .{
50975095 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5098 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5096 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
50995097 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
51005098 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
51015099 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
......@@ -5131,7 +5129,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
51315129 },
51325130 .extra_temps = .{
51335131 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5134 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
5132 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
51355133 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
51365134 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
51375135 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
......@@ -5383,8 +5381,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
53835381 .{ .src = .{ .to_sse, .to_sse } },
53845382 },
53855383 .extra_temps = .{
5386 .{ .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
5387 .{ .kind = .{ .rc = .sse } },
5384 .{ .type = .f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
5385 .{ .type = .f16, .kind = .{ .rc = .sse } },
53885386 .unused,
53895387 .unused,
53905388 .unused,
......@@ -5395,12 +5393,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
53955393 },
53965394 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
53975395 .each = .{ .once = &.{
5398 .{ ._, .v_ps, .cvtph2, .dst0x, .src0x, ._, ._ },
5399 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1x, ._, ._ },
5396 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
5397 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
54005398 .{ ._, .v_ss, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) },
54015399 .{ ._, .v_ss, .max, .dst0x, .tmp0x, .dst0x, ._ },
54025400 .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x },
5403 .{ ._, .v_, .cvtps2ph, .dst0x, .dst0x, .rm(.{}), ._ },
5401 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
54045402 } },
54055403 }, .{
54065404 .required_features = .{ .sse, null, null, null },
......@@ -5423,11 +5421,248 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54235421 .unused,
54245422 .unused,
54255423 },
5426 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
54275424 .dst_temps = .{.{ .ref = .src0 }},
5425 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
54285426 .each = .{ .once = &.{
54295427 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
54305428 } },
5429 }, .{
5430 .required_features = .{ .f16c, null, null, null },
5431 .src_constraints = .{
5432 .{ .scalar_float = .{ .of = .qword, .is = .word } },
5433 .{ .scalar_float = .{ .of = .qword, .is = .word } },
5434 },
5435 .patterns = &.{
5436 .{ .src = .{ .mem, .mem } },
5437 .{ .src = .{ .to_sse, .mem } },
5438 .{ .src = .{ .mem, .to_sse } },
5439 .{ .src = .{ .to_sse, .to_sse } },
5440 },
5441 .extra_temps = .{
5442 .{ .type = .vector_4_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
5443 .{ .type = .vector_4_f16, .kind = .{ .rc = .sse } },
5444 .unused,
5445 .unused,
5446 .unused,
5447 .unused,
5448 .unused,
5449 .unused,
5450 .unused,
5451 },
5452 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
5453 .each = .{ .once = &.{
5454 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
5455 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
5456 .{ ._, .v_ps, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) },
5457 .{ ._, .v_ps, .max, .dst0x, .tmp0x, .dst0x, ._ },
5458 .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x },
5459 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
5460 } },
5461 }, .{
5462 .required_features = .{ .f16c, null, null, null },
5463 .src_constraints = .{
5464 .{ .scalar_float = .{ .of = .xword, .is = .word } },
5465 .{ .scalar_float = .{ .of = .xword, .is = .word } },
5466 },
5467 .patterns = &.{
5468 .{ .src = .{ .mem, .mem } },
5469 .{ .src = .{ .to_sse, .mem } },
5470 .{ .src = .{ .mem, .to_sse } },
5471 .{ .src = .{ .to_sse, .to_sse } },
5472 },
5473 .extra_temps = .{
5474 .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
5475 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
5476 .unused,
5477 .unused,
5478 .unused,
5479 .unused,
5480 .unused,
5481 .unused,
5482 .unused,
5483 },
5484 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
5485 .each = .{ .once = &.{
5486 .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ },
5487 .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ },
5488 .{ ._, .v_ps, .cmp, .tmp1y, .dst0y, .dst0y, .vp(.unord) },
5489 .{ ._, .v_ps, .max, .dst0y, .tmp0y, .dst0y, ._ },
5490 .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .tmp0y, .tmp1y },
5491 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0y, .rm(.{}), ._ },
5492 } },
5493 }, .{
5494 .required_features = .{ .f16c, null, null, null },
5495 .src_constraints = .{
5496 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
5497 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
5498 },
5499 .patterns = &.{
5500 .{ .src = .{ .to_mem, .to_mem } },
5501 },
5502 .extra_temps = .{
5503 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5504 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
5505 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
5506 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
5507 .unused,
5508 .unused,
5509 .unused,
5510 .unused,
5511 .unused,
5512 },
5513 .dst_temps = .{.mem},
5514 .clobbers = .{ .eflags = true },
5515 .each = .{ .once = &.{
5516 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
5517 .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5518 .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5519 .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) },
5520 .{ ._, .v_ps, .max, .tmp1y, .tmp2y, .tmp1y, ._ },
5521 .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
5522 .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_size), .tmp1y, .rm(.{}), ._ },
5523 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
5524 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5525 } },
5526 }, .{
5527 .required_features = .{ .avx, null, null, null },
5528 .src_constraints = .{
5529 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5530 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5531 },
5532 .patterns = &.{
5533 .{ .src = .{ .to_mem, .to_mem } },
5534 },
5535 .call_frame = .{ .alignment = .@"16" },
5536 .extra_temps = .{
5537 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5538 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
5539 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
5540 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } },
5541 .unused,
5542 .unused,
5543 .unused,
5544 .unused,
5545 .unused,
5546 },
5547 .dst_temps = .{.mem},
5548 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
5549 .each = .{ .once = &.{
5550 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
5551 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
5552 .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_size), .ui(0) },
5553 .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0) },
5554 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
5555 .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ },
5556 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
5557 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5558 } },
5559 }, .{
5560 .required_features = .{ .sse4_1, null, null, null },
5561 .src_constraints = .{
5562 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5563 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5564 },
5565 .patterns = &.{
5566 .{ .src = .{ .to_mem, .to_mem } },
5567 },
5568 .call_frame = .{ .alignment = .@"16" },
5569 .extra_temps = .{
5570 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5571 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
5572 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
5573 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } },
5574 .unused,
5575 .unused,
5576 .unused,
5577 .unused,
5578 .unused,
5579 },
5580 .dst_temps = .{.mem},
5581 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
5582 .each = .{ .once = &.{
5583 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
5584 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
5585 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
5586 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ },
5587 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ },
5588 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
5589 .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ },
5590 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
5591 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5592 } },
5593 }, .{
5594 .required_features = .{ .sse2, null, null, null },
5595 .src_constraints = .{
5596 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5597 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5598 },
5599 .patterns = &.{
5600 .{ .src = .{ .to_mem, .to_mem } },
5601 },
5602 .call_frame = .{ .alignment = .@"16" },
5603 .extra_temps = .{
5604 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5605 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
5606 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
5607 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } },
5608 .{ .type = .f16, .kind = .{ .reg = .ax } },
5609 .unused,
5610 .unused,
5611 .unused,
5612 .unused,
5613 },
5614 .dst_temps = .{.mem},
5615 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
5616 .each = .{ .once = &.{
5617 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
5618 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
5619 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
5620 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ },
5621 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ },
5622 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
5623 .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ },
5624 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp4w, ._, ._ },
5625 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
5626 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5627 } },
5628 }, .{
5629 .required_features = .{ .sse, null, null, null },
5630 .src_constraints = .{
5631 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5632 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
5633 },
5634 .patterns = &.{
5635 .{ .src = .{ .to_mem, .to_mem } },
5636 },
5637 .call_frame = .{ .alignment = .@"16" },
5638 .extra_temps = .{
5639 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5640 .{ .type = .f16, .kind = .{ .reg = .eax } },
5641 .{ .type = .f32, .kind = .mem },
5642 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
5643 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
5644 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fmaxh" } } },
5645 .unused,
5646 .unused,
5647 .unused,
5648 },
5649 .dst_temps = .{.mem},
5650 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
5651 .each = .{ .once = &.{
5652 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
5653 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
5654 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
5655 .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ },
5656 .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_size), ._, ._ },
5657 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
5658 .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ },
5659 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
5660 .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ },
5661 .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ },
5662 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
5663 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
5664 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5665 } },
54315666 }, .{
54325667 .required_features = .{ .avx, null, null, null },
54335668 .src_constraints = .{
......@@ -5438,7 +5673,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54385673 .{ .src = .{ .to_sse, .to_sse } },
54395674 },
54405675 .extra_temps = .{
5441 .{ .kind = .{ .rc = .sse } },
5676 .{ .type = .f32, .kind = .{ .rc = .sse } },
54425677 .unused,
54435678 .unused,
54445679 .unused,
......@@ -5499,6 +5734,210 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
54995734 .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ },
55005735 .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ },
55015736 } },
5737 }, .{
5738 .required_features = .{ .avx, null, null, null },
5739 .src_constraints = .{
5740 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
5741 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
5742 },
5743 .patterns = &.{
5744 .{ .src = .{ .to_sse, .to_sse } },
5745 },
5746 .extra_temps = .{
5747 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
5748 .unused,
5749 .unused,
5750 .unused,
5751 .unused,
5752 .unused,
5753 .unused,
5754 .unused,
5755 .unused,
5756 },
5757 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
5758 .each = .{ .once = &.{
5759 .{ ._, .v_ps, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) },
5760 .{ ._, .v_ps, .max, .dst0x, .src1x, .src0x, ._ },
5761 .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .src1x, .tmp0x },
5762 } },
5763 }, .{
5764 .required_features = .{ .sse4_1, null, null, null },
5765 .src_constraints = .{
5766 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
5767 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
5768 },
5769 .patterns = &.{
5770 .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } },
5771 .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } },
5772 .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } },
5773 },
5774 .dst_temps = .{.{ .rc = .sse }},
5775 .each = .{ .once = &.{
5776 .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ },
5777 .{ ._, ._ps, .max, .dst0x, .src0x, ._, ._ },
5778 .{ ._, ._ps, .cmp, .src0x, .src0x, .vp(.unord), ._ },
5779 .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ },
5780 } },
5781 }, .{
5782 .required_features = .{ .sse, null, null, null },
5783 .src_constraints = .{
5784 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
5785 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
5786 },
5787 .patterns = &.{
5788 .{ .src = .{ .to_mut_sse, .mem } },
5789 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
5790 .{ .src = .{ .to_mut_sse, .to_sse } },
5791 },
5792 .extra_temps = .{
5793 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
5794 .unused,
5795 .unused,
5796 .unused,
5797 .unused,
5798 .unused,
5799 .unused,
5800 .unused,
5801 .unused,
5802 },
5803 .dst_temps = .{.{ .ref = .src0 }},
5804 .each = .{ .once = &.{
5805 .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ },
5806 .{ ._, ._ps, .max, .tmp0x, .src0x, ._, ._ },
5807 .{ ._, ._ps, .cmp, .dst0x, .src0x, .vp(.ord), ._ },
5808 .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ },
5809 .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ },
5810 .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ },
5811 } },
5812 }, .{
5813 .required_features = .{ .avx, null, null, null },
5814 .src_constraints = .{
5815 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
5816 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
5817 },
5818 .patterns = &.{
5819 .{ .src = .{ .to_sse, .to_sse } },
5820 },
5821 .extra_temps = .{
5822 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
5823 .unused,
5824 .unused,
5825 .unused,
5826 .unused,
5827 .unused,
5828 .unused,
5829 .unused,
5830 .unused,
5831 },
5832 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
5833 .each = .{ .once = &.{
5834 .{ ._, .v_ps, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) },
5835 .{ ._, .v_ps, .max, .dst0y, .src1y, .src0y, ._ },
5836 .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .src1y, .tmp0y },
5837 } },
5838 }, .{
5839 .required_features = .{ .avx, null, null, null },
5840 .src_constraints = .{
5841 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
5842 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
5843 },
5844 .patterns = &.{
5845 .{ .src = .{ .to_mem, .to_mem } },
5846 },
5847 .extra_temps = .{
5848 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5849 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
5850 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
5851 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
5852 .unused,
5853 .unused,
5854 .unused,
5855 .unused,
5856 .unused,
5857 },
5858 .dst_temps = .{.mem},
5859 .clobbers = .{ .eflags = true },
5860 .each = .{ .once = &.{
5861 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
5862 .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
5863 .{ ._, .v_ps, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
5864 .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) },
5865 .{ ._, .v_ps, .max, .tmp1y, .tmp2y, .tmp1y, ._ },
5866 .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
5867 .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
5868 .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ },
5869 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5870 } },
5871 }, .{
5872 .required_features = .{ .sse4_1, null, null, null },
5873 .src_constraints = .{
5874 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
5875 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
5876 },
5877 .patterns = &.{
5878 .{ .src = .{ .to_mem, .to_mem } },
5879 },
5880 .extra_temps = .{
5881 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5882 .{ .type = .vector_4_f32, .kind = .{ .reg = .xmm0 } },
5883 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
5884 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
5885 .unused,
5886 .unused,
5887 .unused,
5888 .unused,
5889 .unused,
5890 },
5891 .dst_temps = .{.mem},
5892 .clobbers = .{ .eflags = true },
5893 .each = .{ .once = &.{
5894 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
5895 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5896 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5897 .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ },
5898 .{ ._, ._ps, .max, .tmp3x, .tmp1x, ._, ._ },
5899 .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ },
5900 .{ ._, ._ps, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ },
5901 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
5902 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
5903 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5904 } },
5905 }, .{
5906 .required_features = .{ .sse, null, null, null },
5907 .src_constraints = .{
5908 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
5909 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
5910 },
5911 .patterns = &.{
5912 .{ .src = .{ .to_mem, .to_mem } },
5913 },
5914 .extra_temps = .{
5915 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
5916 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
5917 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
5918 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
5919 .unused,
5920 .unused,
5921 .unused,
5922 .unused,
5923 .unused,
5924 },
5925 .dst_temps = .{.mem},
5926 .clobbers = .{ .eflags = true },
5927 .each = .{ .once = &.{
5928 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
5929 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
5930 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
5931 .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ },
5932 .{ ._, ._ps, .max, .tmp3x, .tmp1x, ._, ._ },
5933 .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ },
5934 .{ ._, ._ps, .@"and", .tmp3x, .tmp1x, ._, ._ },
5935 .{ ._, ._ps, .andn, .tmp1x, .tmp2x, ._, ._ },
5936 .{ ._, ._ps, .@"or", .tmp1x, .tmp3x, ._, ._ },
5937 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
5938 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
5939 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
5940 } },
55025941 }, .{
55035942 .required_features = .{ .avx, null, null, null },
55045943 .src_constraints = .{
......@@ -5509,7 +5948,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
55095948 .{ .src = .{ .to_sse, .to_sse } },
55105949 },
55115950 .extra_temps = .{
5512 .{ .kind = .{ .rc = .sse } },
5951 .{ .type = .f64, .kind = .{ .rc = .sse } },
55135952 .unused,
55145953 .unused,
55155954 .unused,
......@@ -5591,11 +6030,249 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
55916030 .unused,
55926031 .unused,
55936032 },
5594 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
55956033 .dst_temps = .{.{ .ref = .src0 }},
6034 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
55966035 .each = .{ .once = &.{
55976036 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
55986037 } },
6038 }, .{
6039 .required_features = .{ .avx, null, null, null },
6040 .src_constraints = .{
6041 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
6042 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
6043 },
6044 .patterns = &.{
6045 .{ .src = .{ .to_sse, .to_sse } },
6046 },
6047 .extra_temps = .{
6048 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
6049 .unused,
6050 .unused,
6051 .unused,
6052 .unused,
6053 .unused,
6054 .unused,
6055 .unused,
6056 .unused,
6057 },
6058 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
6059 .each = .{ .once = &.{
6060 .{ ._, .v_pd, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) },
6061 .{ ._, .v_pd, .max, .dst0x, .src1x, .src0x, ._ },
6062 .{ ._, .v_pd, .blendv, .dst0x, .dst0x, .src1x, .tmp0x },
6063 } },
6064 }, .{
6065 .required_features = .{ .sse4_1, null, null, null },
6066 .src_constraints = .{
6067 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
6068 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
6069 },
6070 .patterns = &.{
6071 .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } },
6072 .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } },
6073 .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } },
6074 },
6075 .dst_temps = .{.{ .rc = .sse }},
6076 .each = .{ .once = &.{
6077 .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ },
6078 .{ ._, ._pd, .max, .dst0x, .src0x, ._, ._ },
6079 .{ ._, ._pd, .cmp, .src0x, .src0x, .vp(.unord), ._ },
6080 .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ },
6081 } },
6082 }, .{
6083 .required_features = .{ .sse2, null, null, null },
6084 .src_constraints = .{
6085 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
6086 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
6087 },
6088 .patterns = &.{
6089 .{ .src = .{ .to_mut_sse, .mem } },
6090 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
6091 .{ .src = .{ .to_mut_sse, .to_sse } },
6092 },
6093 .extra_temps = .{
6094 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
6095 .unused,
6096 .unused,
6097 .unused,
6098 .unused,
6099 .unused,
6100 .unused,
6101 .unused,
6102 .unused,
6103 },
6104 .dst_temps = .{.{ .ref = .src0 }},
6105 .each = .{ .once = &.{
6106 .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ },
6107 .{ ._, ._pd, .max, .tmp0x, .src0x, ._, ._ },
6108 .{ ._, ._pd, .cmp, .dst0x, .src0x, .vp(.ord), ._ },
6109 .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ },
6110 .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ },
6111 .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ },
6112 } },
6113 }, .{
6114 .required_features = .{ .avx, null, null, null },
6115 .src_constraints = .{
6116 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
6117 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
6118 },
6119 .patterns = &.{
6120 .{ .src = .{ .to_sse, .to_sse } },
6121 },
6122 .extra_temps = .{
6123 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
6124 .unused,
6125 .unused,
6126 .unused,
6127 .unused,
6128 .unused,
6129 .unused,
6130 .unused,
6131 .unused,
6132 },
6133 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
6134 .each = .{ .once = &.{
6135 .{ ._, .v_pd, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) },
6136 .{ ._, .v_pd, .max, .dst0y, .src1y, .src0y, ._ },
6137 .{ ._, .v_pd, .blendv, .dst0y, .dst0y, .src1y, .tmp0y },
6138 } },
6139 }, .{
6140 .required_features = .{ .avx, null, null, null },
6141 .src_constraints = .{
6142 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
6143 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
6144 },
6145 .patterns = &.{
6146 .{ .src = .{ .to_mem, .to_mem } },
6147 },
6148 .extra_temps = .{
6149 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6150 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
6151 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
6152 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
6153 .unused,
6154 .unused,
6155 .unused,
6156 .unused,
6157 .unused,
6158 },
6159 .dst_temps = .{.mem},
6160 .clobbers = .{ .eflags = true },
6161 .each = .{ .once = &.{
6162 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
6163 .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
6164 .{ ._, .v_pd, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
6165 .{ ._, .v_pd, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) },
6166 .{ ._, .v_pd, .max, .tmp1y, .tmp2y, .tmp1y, ._ },
6167 .{ ._, .v_pd, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
6168 .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
6169 .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ },
6170 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6171 } },
6172 }, .{
6173 .required_features = .{ .sse4_1, null, null, null },
6174 .src_constraints = .{
6175 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
6176 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
6177 },
6178 .patterns = &.{
6179 .{ .src = .{ .to_mem, .to_mem } },
6180 },
6181 .extra_temps = .{
6182 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6183 .{ .type = .vector_2_f64, .kind = .{ .reg = .xmm0 } },
6184 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
6185 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
6186 .unused,
6187 .unused,
6188 .unused,
6189 .unused,
6190 .unused,
6191 },
6192 .dst_temps = .{.mem},
6193 .clobbers = .{ .eflags = true },
6194 .each = .{ .once = &.{
6195 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
6196 .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6197 .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6198 .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ },
6199 .{ ._, ._pd, .max, .tmp3x, .tmp1x, ._, ._ },
6200 .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ },
6201 .{ ._, ._pd, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ },
6202 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
6203 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
6204 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6205 } },
6206 }, .{
6207 .required_features = .{ .sse2, null, null, null },
6208 .src_constraints = .{
6209 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
6210 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
6211 },
6212 .patterns = &.{
6213 .{ .src = .{ .to_mem, .to_mem } },
6214 },
6215 .extra_temps = .{
6216 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6217 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
6218 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
6219 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
6220 .unused,
6221 .unused,
6222 .unused,
6223 .unused,
6224 .unused,
6225 },
6226 .dst_temps = .{.mem},
6227 .clobbers = .{ .eflags = true },
6228 .each = .{ .once = &.{
6229 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
6230 .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6231 .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6232 .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ },
6233 .{ ._, ._pd, .max, .tmp3x, .tmp1x, ._, ._ },
6234 .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ },
6235 .{ ._, ._pd, .@"and", .tmp3x, .tmp1x, ._, ._ },
6236 .{ ._, ._pd, .andn, .tmp1x, .tmp2x, ._, ._ },
6237 .{ ._, ._pd, .@"or", .tmp1x, .tmp3x, ._, ._ },
6238 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6239 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
6240 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6241 } },
6242 }, .{
6243 .required_features = .{ .sse, null, null, null },
6244 .src_constraints = .{
6245 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
6246 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
6247 },
6248 .patterns = &.{
6249 .{ .src = .{ .to_mem, .to_mem } },
6250 },
6251 .call_frame = .{ .alignment = .@"16" },
6252 .extra_temps = .{
6253 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6254 .{ .type = .f64, .kind = .{ .reg = .xmm0 } },
6255 .{ .type = .f64, .kind = .{ .reg = .xmm1 } },
6256 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmax" } } },
6257 .unused,
6258 .unused,
6259 .unused,
6260 .unused,
6261 .unused,
6262 },
6263 .dst_temps = .{.mem},
6264 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
6265 .each = .{ .once = &.{
6266 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
6267 .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ },
6268 .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ },
6269 .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_size), ._, ._ },
6270 .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_size), ._, ._ },
6271 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
6272 .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
6273 .{ ._, ._, .add, .tmp0q, .si(8), ._, ._ },
6274 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6275 } },
55996276 }, .{
56006277 .required_features = .{ .x87, .cmov, null, null },
56016278 .src_constraints = .{
......@@ -5750,6 +6427,172 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
57506427 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
57516428 .{ .@"1:", .f_p, .st, .dst0t, ._, ._, ._ },
57526429 } },
6430 }, .{
6431 .required_features = .{ .x87, .cmov, null, null },
6432 .src_constraints = .{
6433 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6434 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6435 },
6436 .patterns = &.{
6437 .{ .src = .{ .to_mem, .to_mem } },
6438 },
6439 .extra_temps = .{
6440 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6441 .{ .type = .f80, .kind = .{ .reg = .st6 } },
6442 .{ .type = .f80, .kind = .{ .reg = .st7 } },
6443 .unused,
6444 .unused,
6445 .unused,
6446 .unused,
6447 .unused,
6448 .unused,
6449 },
6450 .dst_temps = .{.mem},
6451 .clobbers = .{ .eflags = true },
6452 .each = .{ .once = &.{
6453 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6454 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
6455 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
6456 .{ ._, .f_, .ucomi, .tmp1t, .tmp1t, ._, ._ },
6457 .{ ._, .f_u, .cmov, .tmp1t, .tmp2t, ._, ._ },
6458 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6459 .{ ._, .f_, .ucomi, .tmp1t, .tmp2t, ._, ._ },
6460 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6461 .{ ._, .f_nb, .cmov, .tmp1t, .tmp2t, ._, ._ },
6462 .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
6463 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
6464 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6465 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6466 } },
6467 }, .{
6468 .required_features = .{ .sahf, .x87, null, null },
6469 .src_constraints = .{
6470 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6471 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6472 },
6473 .patterns = &.{
6474 .{ .src = .{ .to_mem, .to_mem } },
6475 },
6476 .extra_temps = .{
6477 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6478 .{ .type = .f80, .kind = .{ .reg = .st6 } },
6479 .{ .type = .f80, .kind = .{ .reg = .st7 } },
6480 .{ .type = .u8, .kind = .{ .reg = .ah } },
6481 .unused,
6482 .unused,
6483 .unused,
6484 .unused,
6485 .unused,
6486 },
6487 .dst_temps = .{.mem},
6488 .clobbers = .{ .eflags = true },
6489 .each = .{ .once = &.{
6490 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6491 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
6492 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
6493 .{ ._, .f_, .ucom, .tmp1t, ._, ._, ._ },
6494 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
6495 .{ ._, ._, .sahf, ._, ._, ._, ._ },
6496 .{ ._, ._p, .j, .@"1f", ._, ._, ._ },
6497 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6498 .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ },
6499 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
6500 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6501 .{ ._, ._, .sahf, ._, ._, ._, ._ },
6502 .{ ._, ._b, .j, .@"2f", ._, ._, ._ },
6503 .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ },
6504 .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ },
6505 .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
6506 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
6507 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6508 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6509 } },
6510 }, .{
6511 .required_features = .{ .@"64bit", .x87, null, null },
6512 .src_constraints = .{
6513 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6514 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6515 },
6516 .patterns = &.{
6517 .{ .src = .{ .to_mem, .to_mem } },
6518 },
6519 .extra_temps = .{
6520 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6521 .{ .type = .f80, .kind = .{ .reg = .st6 } },
6522 .{ .type = .f80, .kind = .{ .reg = .st7 } },
6523 .{ .type = .u8, .kind = .{ .reg = .ah } },
6524 .unused,
6525 .unused,
6526 .unused,
6527 .unused,
6528 .unused,
6529 },
6530 .dst_temps = .{.mem},
6531 .clobbers = .{ .eflags = true },
6532 .each = .{ .once = &.{
6533 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6534 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
6535 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
6536 .{ ._, .f_, .xam, ._, ._, ._, ._ },
6537 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
6538 .{ ._, ._, .@"test", .tmp3b, .si(0b0_1_000_100), ._, ._ },
6539 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
6540 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6541 .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ },
6542 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
6543 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6544 .{ ._, ._, .@"test", .tmp3b, .si(0b0_0_000_001), ._, ._ },
6545 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
6546 .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ },
6547 .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ },
6548 .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
6549 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
6550 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6551 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6552 } },
6553 }, .{
6554 .required_features = .{ .x87, null, null, null },
6555 .src_constraints = .{
6556 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6557 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
6558 },
6559 .patterns = &.{
6560 .{ .src = .{ .to_mem, .to_mem } },
6561 },
6562 .extra_temps = .{
6563 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6564 .{ .type = .f80, .kind = .{ .reg = .st6 } },
6565 .{ .type = .f80, .kind = .{ .reg = .st7 } },
6566 .{ .type = .u8, .kind = .{ .reg = .ah } },
6567 .unused,
6568 .unused,
6569 .unused,
6570 .unused,
6571 .unused,
6572 },
6573 .dst_temps = .{.mem},
6574 .clobbers = .{ .eflags = true },
6575 .each = .{ .once = &.{
6576 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
6577 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
6578 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
6579 .{ ._, .f_, .ucom, .tmp1t, ._, ._, ._ },
6580 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
6581 .{ ._, ._, .sahf, ._, ._, ._, ._ },
6582 .{ ._, ._p, .j, .@"1f", ._, ._, ._ },
6583 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6584 .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ },
6585 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
6586 .{ ._, .f_, .xch, .tmp2t, ._, ._, ._ },
6587 .{ ._, ._, .sahf, ._, ._, ._, ._ },
6588 .{ ._, ._b, .j, .@"2f", ._, ._, ._ },
6589 .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ },
6590 .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ },
6591 .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
6592 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
6593 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
6594 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6595 } },
57536596 }, .{
57546597 .required_features = .{ .sse, null, null, null },
57556598 .src_constraints = .{
......@@ -5771,11 +6614,107 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
57716614 .unused,
57726615 .unused,
57736616 },
5774 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
57756617 .dst_temps = .{.{ .ref = .src0 }},
6618 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
57766619 .each = .{ .once = &.{
57776620 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
57786621 } },
6622 }, .{
6623 .required_features = .{ .avx, null, null, null },
6624 .src_constraints = .{
6625 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
6626 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
6627 },
6628 .patterns = &.{
6629 .{ .src = .{ .to_mem, .to_mem } },
6630 },
6631 .call_frame = .{ .alignment = .@"16" },
6632 .extra_temps = .{
6633 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6634 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
6635 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
6636 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } },
6637 .unused,
6638 .unused,
6639 .unused,
6640 .unused,
6641 .unused,
6642 },
6643 .dst_temps = .{.mem},
6644 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
6645 .each = .{ .once = &.{
6646 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
6647 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6648 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6649 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
6650 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6651 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
6652 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6653 } },
6654 }, .{
6655 .required_features = .{ .sse2, null, null, null },
6656 .src_constraints = .{
6657 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
6658 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
6659 },
6660 .patterns = &.{
6661 .{ .src = .{ .to_mem, .to_mem } },
6662 },
6663 .call_frame = .{ .alignment = .@"16" },
6664 .extra_temps = .{
6665 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6666 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
6667 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
6668 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } },
6669 .unused,
6670 .unused,
6671 .unused,
6672 .unused,
6673 .unused,
6674 },
6675 .dst_temps = .{.mem},
6676 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
6677 .each = .{ .once = &.{
6678 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
6679 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6680 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6681 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
6682 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6683 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
6684 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6685 } },
6686 }, .{
6687 .required_features = .{ .sse, null, null, null },
6688 .src_constraints = .{
6689 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
6690 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
6691 },
6692 .patterns = &.{
6693 .{ .src = .{ .to_mem, .to_mem } },
6694 },
6695 .call_frame = .{ .alignment = .@"16" },
6696 .extra_temps = .{
6697 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
6698 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
6699 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
6700 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmaxq" } } },
6701 .unused,
6702 .unused,
6703 .unused,
6704 .unused,
6705 .unused,
6706 },
6707 .dst_temps = .{.mem},
6708 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
6709 .each = .{ .once = &.{
6710 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
6711 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
6712 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
6713 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
6714 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
6715 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
6716 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
6717 } },
57796718 } }) catch |err| switch (err) {
57806719 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
57816720 @tagName(air_tag),
......@@ -5787,10 +6726,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
57876726 };
57886727 try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg);
57896728 },
5790 .min => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else fallback: {
6729 .min => |air_tag| if (use_old) try cg.airBinOp(inst, air_tag) else {
57916730 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
5792 const ty = cg.typeOf(bin_op.lhs);
5793 if (ty.isVector(zcu) and cg.floatBits(ty.childType(zcu)) != null) break :fallback try cg.airBinOp(inst, air_tag);
57946731 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
57956732 var res: [1]Temp = undefined;
57966733 cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{
......@@ -7494,7 +8431,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
74948431 },
74958432 .extra_temps = .{
74968433 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7497 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
8434 .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
74988435 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
74998436 .unused,
75008437 .unused,
......@@ -7631,7 +8568,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
76318568 },
76328569 .extra_temps = .{
76338570 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
7634 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
8571 .{ .type = .vector_4_u32, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .xword } } },
76358572 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
76368573 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
76378574 .{ .type = .vector_4_u32, .kind = .{ .rc = .sse } },
......@@ -7955,7 +8892,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
79558892 },
79568893 .extra_temps = .{
79578894 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7958 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
8895 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
79598896 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
79608897 .unused,
79618898 .unused,
......@@ -7986,7 +8923,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
79868923 },
79878924 .extra_temps = .{
79888925 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
7989 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
8926 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
79908927 .{ .type = .vector_2_u64, .kind = .{ .reg = .xmm0 } },
79918928 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
79928929 .unused,
......@@ -8018,7 +8955,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
80188955 },
80198956 .extra_temps = .{
80208957 .{ .type = .usize, .kind = .{ .rc = .general_purpose } },
8021 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
8958 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
80228959 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
80238960 .unused,
80248961 .unused,
......@@ -8047,7 +8984,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
80478984 },
80488985 .extra_temps = .{
80498986 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8050 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
8987 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
80518988 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
80528989 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
80538990 .{ .type = .vector_4_u64, .kind = .{ .rc = .sse } },
......@@ -8083,7 +9020,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
80839020 },
80849021 .extra_temps = .{
80859022 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8086 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
9023 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
80879024 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
80889025 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
80899026 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
......@@ -8119,7 +9056,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
81199056 },
81209057 .extra_temps = .{
81219058 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8122 .{ .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
9059 .{ .type = .u64, .kind = .{ .smin_mem = .{ .ref = .src0, .vectorize_to = .none } } },
81239060 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
81249061 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
81259062 .{ .type = .vector_2_u64, .kind = .{ .rc = .sse } },
......@@ -8371,8 +9308,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
83719308 .{ .src = .{ .to_sse, .to_sse } },
83729309 },
83739310 .extra_temps = .{
8374 .{ .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
8375 .{ .kind = .{ .rc = .sse } },
9311 .{ .type = .f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
9312 .{ .type = .f16, .kind = .{ .rc = .sse } },
83769313 .unused,
83779314 .unused,
83789315 .unused,
......@@ -8383,12 +9320,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
83839320 },
83849321 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
83859322 .each = .{ .once = &.{
8386 .{ ._, .v_ps, .cvtph2, .dst0x, .src0x, ._, ._ },
8387 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1x, ._, ._ },
9323 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
9324 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
83889325 .{ ._, .v_ss, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) },
83899326 .{ ._, .v_ss, .min, .dst0x, .tmp0x, .dst0x, ._ },
83909327 .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x },
8391 .{ ._, .v_, .cvtps2ph, .dst0x, .dst0x, .rm(.{}), ._ },
9328 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
83929329 } },
83939330 }, .{
83949331 .required_features = .{ .sse, null, null, null },
......@@ -8411,11 +9348,248 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
84119348 .unused,
84129349 .unused,
84139350 },
8414 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
84159351 .dst_temps = .{.{ .ref = .src0 }},
9352 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
84169353 .each = .{ .once = &.{
84179354 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
84189355 } },
9356 }, .{
9357 .required_features = .{ .f16c, null, null, null },
9358 .src_constraints = .{
9359 .{ .scalar_float = .{ .of = .qword, .is = .word } },
9360 .{ .scalar_float = .{ .of = .qword, .is = .word } },
9361 },
9362 .patterns = &.{
9363 .{ .src = .{ .mem, .mem } },
9364 .{ .src = .{ .to_sse, .mem } },
9365 .{ .src = .{ .mem, .to_sse } },
9366 .{ .src = .{ .to_sse, .to_sse } },
9367 },
9368 .extra_temps = .{
9369 .{ .type = .vector_4_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
9370 .{ .type = .vector_4_f16, .kind = .{ .rc = .sse } },
9371 .unused,
9372 .unused,
9373 .unused,
9374 .unused,
9375 .unused,
9376 .unused,
9377 .unused,
9378 },
9379 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9380 .each = .{ .once = &.{
9381 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
9382 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
9383 .{ ._, .v_ps, .cmp, .tmp1x, .dst0x, .dst0x, .vp(.unord) },
9384 .{ ._, .v_ps, .min, .dst0x, .tmp0x, .dst0x, ._ },
9385 .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .tmp0x, .tmp1x },
9386 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0x, .rm(.{}), ._ },
9387 } },
9388 }, .{
9389 .required_features = .{ .f16c, null, null, null },
9390 .src_constraints = .{
9391 .{ .scalar_float = .{ .of = .xword, .is = .word } },
9392 .{ .scalar_float = .{ .of = .xword, .is = .word } },
9393 },
9394 .patterns = &.{
9395 .{ .src = .{ .mem, .mem } },
9396 .{ .src = .{ .to_sse, .mem } },
9397 .{ .src = .{ .mem, .to_sse } },
9398 .{ .src = .{ .to_sse, .to_sse } },
9399 },
9400 .extra_temps = .{
9401 .{ .type = .vector_8_f16, .kind = .{ .mut_rc = .{ .ref = .src1, .rc = .sse } } },
9402 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
9403 .unused,
9404 .unused,
9405 .unused,
9406 .unused,
9407 .unused,
9408 .unused,
9409 .unused,
9410 },
9411 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9412 .each = .{ .once = &.{
9413 .{ ._, .v_ps, .cvtph2, .dst0y, .src0x, ._, ._ },
9414 .{ ._, .v_ps, .cvtph2, .tmp0y, .src1x, ._, ._ },
9415 .{ ._, .v_ps, .cmp, .tmp1y, .dst0y, .dst0y, .vp(.unord) },
9416 .{ ._, .v_ps, .min, .dst0y, .tmp0y, .dst0y, ._ },
9417 .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .tmp0y, .tmp1y },
9418 .{ ._, .v_, .cvtps2ph, .dst0q, .dst0y, .rm(.{}), ._ },
9419 } },
9420 }, .{
9421 .required_features = .{ .f16c, null, null, null },
9422 .src_constraints = .{
9423 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
9424 .{ .multiple_scalar_float = .{ .of = .xword, .is = .word } },
9425 },
9426 .patterns = &.{
9427 .{ .src = .{ .to_mem, .to_mem } },
9428 },
9429 .extra_temps = .{
9430 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9431 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
9432 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
9433 .{ .type = .vector_8_f16, .kind = .{ .rc = .sse } },
9434 .unused,
9435 .unused,
9436 .unused,
9437 .unused,
9438 .unused,
9439 },
9440 .dst_temps = .{.mem},
9441 .clobbers = .{ .eflags = true },
9442 .each = .{ .once = &.{
9443 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
9444 .{ .@"0:", .v_ps, .cvtph2, .tmp1y, .memia(.src0x, .tmp0, .add_size), ._, ._ },
9445 .{ ._, .v_ps, .cvtph2, .tmp2y, .memia(.src1x, .tmp0, .add_size), ._, ._ },
9446 .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) },
9447 .{ ._, .v_ps, .min, .tmp1y, .tmp2y, .tmp1y, ._ },
9448 .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
9449 .{ ._, .v_, .cvtps2ph, .memia(.dst0x, .tmp0, .add_size), .tmp1y, .rm(.{}), ._ },
9450 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
9451 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9452 } },
9453 }, .{
9454 .required_features = .{ .avx, null, null, null },
9455 .src_constraints = .{
9456 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9457 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9458 },
9459 .patterns = &.{
9460 .{ .src = .{ .to_mem, .to_mem } },
9461 },
9462 .call_frame = .{ .alignment = .@"16" },
9463 .extra_temps = .{
9464 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9465 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
9466 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
9467 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fminh" } } },
9468 .unused,
9469 .unused,
9470 .unused,
9471 .unused,
9472 .unused,
9473 },
9474 .dst_temps = .{.mem},
9475 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
9476 .each = .{ .once = &.{
9477 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
9478 .{ .@"0:", .vp_, .xor, .tmp2x, .tmp2x, .tmp2x, ._ },
9479 .{ ._, .vp_w, .insr, .tmp1x, .tmp2x, .memia(.src0w, .tmp0, .add_size), .ui(0) },
9480 .{ ._, .vp_w, .insr, .tmp2x, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0) },
9481 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
9482 .{ ._, .vp_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ },
9483 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
9484 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9485 } },
9486 }, .{
9487 .required_features = .{ .sse4_1, null, null, null },
9488 .src_constraints = .{
9489 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9490 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9491 },
9492 .patterns = &.{
9493 .{ .src = .{ .to_mem, .to_mem } },
9494 },
9495 .call_frame = .{ .alignment = .@"16" },
9496 .extra_temps = .{
9497 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9498 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
9499 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
9500 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fminh" } } },
9501 .unused,
9502 .unused,
9503 .unused,
9504 .unused,
9505 .unused,
9506 },
9507 .dst_temps = .{.mem},
9508 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
9509 .each = .{ .once = &.{
9510 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
9511 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
9512 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
9513 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ },
9514 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ },
9515 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
9516 .{ ._, .p_w, .extr, .memia(.dst0w, .tmp0, .add_size), .tmp1x, .ui(0), ._ },
9517 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
9518 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9519 } },
9520 }, .{
9521 .required_features = .{ .sse2, null, null, null },
9522 .src_constraints = .{
9523 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9524 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9525 },
9526 .patterns = &.{
9527 .{ .src = .{ .to_mem, .to_mem } },
9528 },
9529 .call_frame = .{ .alignment = .@"16" },
9530 .extra_temps = .{
9531 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9532 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
9533 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
9534 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fminh" } } },
9535 .{ .type = .f16, .kind = .{ .reg = .ax } },
9536 .unused,
9537 .unused,
9538 .unused,
9539 .unused,
9540 },
9541 .dst_temps = .{.mem},
9542 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
9543 .each = .{ .once = &.{
9544 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
9545 .{ .@"0:", .p_, .xor, .tmp1x, .tmp1x, ._, ._ },
9546 .{ ._, .p_, .xor, .tmp2x, .tmp2x, ._, ._ },
9547 .{ ._, .p_w, .insr, .tmp1x, .memia(.src0w, .tmp0, .add_size), .ui(0), ._ },
9548 .{ ._, .p_w, .insr, .tmp2x, .memia(.src1w, .tmp0, .add_size), .ui(0), ._ },
9549 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
9550 .{ ._, .p_w, .extr, .tmp4d, .tmp1x, .ui(0), ._ },
9551 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp4w, ._, ._ },
9552 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
9553 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9554 } },
9555 }, .{
9556 .required_features = .{ .sse, null, null, null },
9557 .src_constraints = .{
9558 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9559 .{ .multiple_scalar_float = .{ .of = .word, .is = .word } },
9560 },
9561 .patterns = &.{
9562 .{ .src = .{ .to_mem, .to_mem } },
9563 },
9564 .call_frame = .{ .alignment = .@"16" },
9565 .extra_temps = .{
9566 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9567 .{ .type = .f16, .kind = .{ .reg = .eax } },
9568 .{ .type = .f32, .kind = .mem },
9569 .{ .type = .f16, .kind = .{ .reg = .xmm0 } },
9570 .{ .type = .f16, .kind = .{ .reg = .xmm1 } },
9571 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__fminh" } } },
9572 .unused,
9573 .unused,
9574 .unused,
9575 },
9576 .dst_temps = .{.mem},
9577 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
9578 .each = .{ .once = &.{
9579 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
9580 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0w, .tmp0, .add_size), ._, ._ },
9581 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
9582 .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp2d), ._, ._ },
9583 .{ ._, ._, .movzx, .tmp1d, .memia(.src1w, .tmp0, .add_size), ._, ._ },
9584 .{ ._, ._, .mov, .mem(.tmp2d), .tmp1d, ._, ._ },
9585 .{ ._, ._ss, .mov, .tmp4x, .mem(.tmp2d), ._, ._ },
9586 .{ ._, ._, .call, .tmp5d, ._, ._, ._ },
9587 .{ ._, ._ss, .mov, .mem(.tmp2d), .tmp3x, ._, ._ },
9588 .{ ._, ._, .mov, .tmp1d, .mem(.tmp2d), ._, ._ },
9589 .{ ._, ._, .mov, .memia(.dst0w, .tmp0, .add_size), .tmp1w, ._, ._ },
9590 .{ ._, ._, .add, .tmp0q, .si(2), ._, ._ },
9591 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9592 } },
84199593 }, .{
84209594 .required_features = .{ .avx, null, null, null },
84219595 .src_constraints = .{
......@@ -8426,7 +9600,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
84269600 .{ .src = .{ .to_sse, .to_sse } },
84279601 },
84289602 .extra_temps = .{
8429 .{ .kind = .{ .rc = .sse } },
9603 .{ .type = .f32, .kind = .{ .rc = .sse } },
84309604 .unused,
84319605 .unused,
84329606 .unused,
......@@ -8487,6 +9661,210 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
84879661 .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ },
84889662 .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ },
84899663 } },
9664 }, .{
9665 .required_features = .{ .avx, null, null, null },
9666 .src_constraints = .{
9667 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
9668 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
9669 },
9670 .patterns = &.{
9671 .{ .src = .{ .to_sse, .to_sse } },
9672 },
9673 .extra_temps = .{
9674 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
9675 .unused,
9676 .unused,
9677 .unused,
9678 .unused,
9679 .unused,
9680 .unused,
9681 .unused,
9682 .unused,
9683 },
9684 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9685 .each = .{ .once = &.{
9686 .{ ._, .v_ps, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) },
9687 .{ ._, .v_ps, .min, .dst0x, .src1x, .src0x, ._ },
9688 .{ ._, .v_ps, .blendv, .dst0x, .dst0x, .src1x, .tmp0x },
9689 } },
9690 }, .{
9691 .required_features = .{ .sse4_1, null, null, null },
9692 .src_constraints = .{
9693 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
9694 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
9695 },
9696 .patterns = &.{
9697 .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } },
9698 .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } },
9699 .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } },
9700 },
9701 .dst_temps = .{.{ .rc = .sse }},
9702 .each = .{ .once = &.{
9703 .{ ._, ._ps, .mova, .dst0x, .src1x, ._, ._ },
9704 .{ ._, ._ps, .min, .dst0x, .src0x, ._, ._ },
9705 .{ ._, ._ps, .cmp, .src0x, .src0x, .vp(.unord), ._ },
9706 .{ ._, ._ps, .blendv, .dst0x, .src1x, .src0x, ._ },
9707 } },
9708 }, .{
9709 .required_features = .{ .sse, null, null, null },
9710 .src_constraints = .{
9711 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
9712 .{ .scalar_float = .{ .of = .xword, .is = .dword } },
9713 },
9714 .patterns = &.{
9715 .{ .src = .{ .to_mut_sse, .mem } },
9716 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
9717 .{ .src = .{ .to_mut_sse, .to_sse } },
9718 },
9719 .extra_temps = .{
9720 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
9721 .unused,
9722 .unused,
9723 .unused,
9724 .unused,
9725 .unused,
9726 .unused,
9727 .unused,
9728 .unused,
9729 },
9730 .dst_temps = .{.{ .ref = .src0 }},
9731 .each = .{ .once = &.{
9732 .{ ._, ._ps, .mova, .tmp0x, .src1x, ._, ._ },
9733 .{ ._, ._ps, .min, .tmp0x, .src0x, ._, ._ },
9734 .{ ._, ._ps, .cmp, .dst0x, .src0x, .vp(.ord), ._ },
9735 .{ ._, ._ps, .@"and", .tmp0x, .dst0x, ._, ._ },
9736 .{ ._, ._ps, .andn, .dst0x, .src1x, ._, ._ },
9737 .{ ._, ._ps, .@"or", .dst0x, .tmp0x, ._, ._ },
9738 } },
9739 }, .{
9740 .required_features = .{ .avx, null, null, null },
9741 .src_constraints = .{
9742 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
9743 .{ .scalar_float = .{ .of = .yword, .is = .dword } },
9744 },
9745 .patterns = &.{
9746 .{ .src = .{ .to_sse, .to_sse } },
9747 },
9748 .extra_temps = .{
9749 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
9750 .unused,
9751 .unused,
9752 .unused,
9753 .unused,
9754 .unused,
9755 .unused,
9756 .unused,
9757 .unused,
9758 },
9759 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9760 .each = .{ .once = &.{
9761 .{ ._, .v_ps, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) },
9762 .{ ._, .v_ps, .min, .dst0y, .src1y, .src0y, ._ },
9763 .{ ._, .v_ps, .blendv, .dst0y, .dst0y, .src1y, .tmp0y },
9764 } },
9765 }, .{
9766 .required_features = .{ .avx, null, null, null },
9767 .src_constraints = .{
9768 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
9769 .{ .multiple_scalar_float = .{ .of = .yword, .is = .dword } },
9770 },
9771 .patterns = &.{
9772 .{ .src = .{ .to_mem, .to_mem } },
9773 },
9774 .extra_temps = .{
9775 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9776 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
9777 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
9778 .{ .type = .vector_8_f32, .kind = .{ .rc = .sse } },
9779 .unused,
9780 .unused,
9781 .unused,
9782 .unused,
9783 .unused,
9784 },
9785 .dst_temps = .{.mem},
9786 .clobbers = .{ .eflags = true },
9787 .each = .{ .once = &.{
9788 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
9789 .{ .@"0:", .v_ps, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
9790 .{ ._, .v_ps, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
9791 .{ ._, .v_ps, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) },
9792 .{ ._, .v_ps, .min, .tmp1y, .tmp2y, .tmp1y, ._ },
9793 .{ ._, .v_ps, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
9794 .{ ._, .v_ps, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
9795 .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ },
9796 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9797 } },
9798 }, .{
9799 .required_features = .{ .sse4_1, null, null, null },
9800 .src_constraints = .{
9801 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
9802 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
9803 },
9804 .patterns = &.{
9805 .{ .src = .{ .to_mem, .to_mem } },
9806 },
9807 .extra_temps = .{
9808 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9809 .{ .type = .vector_4_f32, .kind = .{ .reg = .xmm0 } },
9810 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
9811 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
9812 .unused,
9813 .unused,
9814 .unused,
9815 .unused,
9816 .unused,
9817 },
9818 .dst_temps = .{.mem},
9819 .clobbers = .{ .eflags = true },
9820 .each = .{ .once = &.{
9821 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
9822 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
9823 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
9824 .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ },
9825 .{ ._, ._ps, .min, .tmp3x, .tmp1x, ._, ._ },
9826 .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ },
9827 .{ ._, ._ps, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ },
9828 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
9829 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
9830 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9831 } },
9832 }, .{
9833 .required_features = .{ .sse, null, null, null },
9834 .src_constraints = .{
9835 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
9836 .{ .multiple_scalar_float = .{ .of = .xword, .is = .dword } },
9837 },
9838 .patterns = &.{
9839 .{ .src = .{ .to_mem, .to_mem } },
9840 },
9841 .extra_temps = .{
9842 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9843 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
9844 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
9845 .{ .type = .vector_4_f32, .kind = .{ .rc = .sse } },
9846 .unused,
9847 .unused,
9848 .unused,
9849 .unused,
9850 .unused,
9851 },
9852 .dst_temps = .{.mem},
9853 .clobbers = .{ .eflags = true },
9854 .each = .{ .once = &.{
9855 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
9856 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
9857 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
9858 .{ ._, ._ps, .mova, .tmp3x, .tmp2x, ._, ._ },
9859 .{ ._, ._ps, .min, .tmp3x, .tmp1x, ._, ._ },
9860 .{ ._, ._ps, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ },
9861 .{ ._, ._ps, .@"and", .tmp3x, .tmp1x, ._, ._ },
9862 .{ ._, ._ps, .andn, .tmp1x, .tmp2x, ._, ._ },
9863 .{ ._, ._ps, .@"or", .tmp1x, .tmp3x, ._, ._ },
9864 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
9865 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
9866 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
9867 } },
84909868 }, .{
84919869 .required_features = .{ .avx, null, null, null },
84929870 .src_constraints = .{
......@@ -8497,7 +9875,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
84979875 .{ .src = .{ .to_sse, .to_sse } },
84989876 },
84999877 .extra_temps = .{
8500 .{ .kind = .{ .rc = .sse } },
9878 .{ .type = .f64, .kind = .{ .rc = .sse } },
85019879 .unused,
85029880 .unused,
85039881 .unused,
......@@ -8579,11 +9957,249 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
85799957 .unused,
85809958 .unused,
85819959 },
8582 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
85839960 .dst_temps = .{.{ .ref = .src0 }},
9961 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
85849962 .each = .{ .once = &.{
85859963 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
85869964 } },
9965 }, .{
9966 .required_features = .{ .avx, null, null, null },
9967 .src_constraints = .{
9968 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
9969 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
9970 },
9971 .patterns = &.{
9972 .{ .src = .{ .to_sse, .to_sse } },
9973 },
9974 .extra_temps = .{
9975 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
9976 .unused,
9977 .unused,
9978 .unused,
9979 .unused,
9980 .unused,
9981 .unused,
9982 .unused,
9983 .unused,
9984 },
9985 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
9986 .each = .{ .once = &.{
9987 .{ ._, .v_pd, .cmp, .tmp0x, .src0x, .src0x, .vp(.unord) },
9988 .{ ._, .v_pd, .min, .dst0x, .src1x, .src0x, ._ },
9989 .{ ._, .v_pd, .blendv, .dst0x, .dst0x, .src1x, .tmp0x },
9990 } },
9991 }, .{
9992 .required_features = .{ .sse4_1, null, null, null },
9993 .src_constraints = .{
9994 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
9995 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
9996 },
9997 .patterns = &.{
9998 .{ .src = .{ .{ .to_reg = .xmm0 }, .mem } },
9999 .{ .src = .{ .mem, .{ .to_reg = .xmm0 } }, .commute = .{ 0, 1 } },
10000 .{ .src = .{ .{ .to_reg = .xmm0 }, .to_sse } },
10001 },
10002 .dst_temps = .{.{ .rc = .sse }},
10003 .each = .{ .once = &.{
10004 .{ ._, ._pd, .mova, .dst0x, .src1x, ._, ._ },
10005 .{ ._, ._pd, .min, .dst0x, .src0x, ._, ._ },
10006 .{ ._, ._pd, .cmp, .src0x, .src0x, .vp(.unord), ._ },
10007 .{ ._, ._pd, .blendv, .dst0x, .src1x, .src0x, ._ },
10008 } },
10009 }, .{
10010 .required_features = .{ .sse2, null, null, null },
10011 .src_constraints = .{
10012 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
10013 .{ .scalar_float = .{ .of = .xword, .is = .qword } },
10014 },
10015 .patterns = &.{
10016 .{ .src = .{ .to_mut_sse, .mem } },
10017 .{ .src = .{ .mem, .to_mut_sse }, .commute = .{ 0, 1 } },
10018 .{ .src = .{ .to_mut_sse, .to_sse } },
10019 },
10020 .extra_temps = .{
10021 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
10022 .unused,
10023 .unused,
10024 .unused,
10025 .unused,
10026 .unused,
10027 .unused,
10028 .unused,
10029 .unused,
10030 },
10031 .dst_temps = .{.{ .ref = .src0 }},
10032 .each = .{ .once = &.{
10033 .{ ._, ._pd, .mova, .tmp0x, .src1x, ._, ._ },
10034 .{ ._, ._pd, .min, .tmp0x, .src0x, ._, ._ },
10035 .{ ._, ._pd, .cmp, .dst0x, .src0x, .vp(.ord), ._ },
10036 .{ ._, ._pd, .@"and", .tmp0x, .dst0x, ._, ._ },
10037 .{ ._, ._pd, .andn, .dst0x, .src1x, ._, ._ },
10038 .{ ._, ._pd, .@"or", .dst0x, .tmp0x, ._, ._ },
10039 } },
10040 }, .{
10041 .required_features = .{ .avx, null, null, null },
10042 .src_constraints = .{
10043 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
10044 .{ .scalar_float = .{ .of = .yword, .is = .qword } },
10045 },
10046 .patterns = &.{
10047 .{ .src = .{ .to_sse, .to_sse } },
10048 },
10049 .extra_temps = .{
10050 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
10051 .unused,
10052 .unused,
10053 .unused,
10054 .unused,
10055 .unused,
10056 .unused,
10057 .unused,
10058 .unused,
10059 },
10060 .dst_temps = .{.{ .mut_rc = .{ .ref = .src0, .rc = .sse } }},
10061 .each = .{ .once = &.{
10062 .{ ._, .v_pd, .cmp, .tmp0y, .src0y, .src0y, .vp(.unord) },
10063 .{ ._, .v_pd, .min, .dst0y, .src1y, .src0y, ._ },
10064 .{ ._, .v_pd, .blendv, .dst0y, .dst0y, .src1y, .tmp0y },
10065 } },
10066 }, .{
10067 .required_features = .{ .avx, null, null, null },
10068 .src_constraints = .{
10069 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
10070 .{ .multiple_scalar_float = .{ .of = .yword, .is = .qword } },
10071 },
10072 .patterns = &.{
10073 .{ .src = .{ .to_mem, .to_mem } },
10074 },
10075 .extra_temps = .{
10076 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10077 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
10078 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
10079 .{ .type = .vector_4_f64, .kind = .{ .rc = .sse } },
10080 .unused,
10081 .unused,
10082 .unused,
10083 .unused,
10084 .unused,
10085 },
10086 .dst_temps = .{.mem},
10087 .clobbers = .{ .eflags = true },
10088 .each = .{ .once = &.{
10089 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
10090 .{ .@"0:", .v_pd, .mova, .tmp1y, .memia(.src0y, .tmp0, .add_size), ._, ._ },
10091 .{ ._, .v_pd, .mova, .tmp2y, .memia(.src1y, .tmp0, .add_size), ._, ._ },
10092 .{ ._, .v_pd, .cmp, .tmp3y, .tmp1y, .tmp1y, .vp(.unord) },
10093 .{ ._, .v_pd, .min, .tmp1y, .tmp2y, .tmp1y, ._ },
10094 .{ ._, .v_pd, .blendv, .tmp1y, .tmp1y, .tmp2y, .tmp3y },
10095 .{ ._, .v_pd, .mova, .memia(.dst0y, .tmp0, .add_size), .tmp1y, ._, ._ },
10096 .{ ._, ._, .add, .tmp0q, .si(32), ._, ._ },
10097 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10098 } },
10099 }, .{
10100 .required_features = .{ .sse4_1, null, null, null },
10101 .src_constraints = .{
10102 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
10103 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
10104 },
10105 .patterns = &.{
10106 .{ .src = .{ .to_mem, .to_mem } },
10107 },
10108 .extra_temps = .{
10109 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10110 .{ .type = .vector_2_f64, .kind = .{ .reg = .xmm0 } },
10111 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
10112 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
10113 .unused,
10114 .unused,
10115 .unused,
10116 .unused,
10117 .unused,
10118 },
10119 .dst_temps = .{.mem},
10120 .clobbers = .{ .eflags = true },
10121 .each = .{ .once = &.{
10122 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
10123 .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
10124 .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
10125 .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ },
10126 .{ ._, ._pd, .min, .tmp3x, .tmp1x, ._, ._ },
10127 .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.unord), ._ },
10128 .{ ._, ._pd, .blendv, .tmp3x, .tmp2x, .tmp1x, ._ },
10129 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp3x, ._, ._ },
10130 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
10131 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10132 } },
10133 }, .{
10134 .required_features = .{ .sse2, null, null, null },
10135 .src_constraints = .{
10136 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
10137 .{ .multiple_scalar_float = .{ .of = .xword, .is = .qword } },
10138 },
10139 .patterns = &.{
10140 .{ .src = .{ .to_mem, .to_mem } },
10141 },
10142 .extra_temps = .{
10143 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10144 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
10145 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
10146 .{ .type = .vector_2_f64, .kind = .{ .rc = .sse } },
10147 .unused,
10148 .unused,
10149 .unused,
10150 .unused,
10151 .unused,
10152 },
10153 .dst_temps = .{.mem},
10154 .clobbers = .{ .eflags = true },
10155 .each = .{ .once = &.{
10156 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
10157 .{ .@"0:", ._pd, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
10158 .{ ._, ._pd, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
10159 .{ ._, ._pd, .mova, .tmp3x, .tmp2x, ._, ._ },
10160 .{ ._, ._pd, .min, .tmp3x, .tmp1x, ._, ._ },
10161 .{ ._, ._pd, .cmp, .tmp1x, .tmp1x, .vp(.ord), ._ },
10162 .{ ._, ._pd, .@"and", .tmp3x, .tmp1x, ._, ._ },
10163 .{ ._, ._pd, .andn, .tmp1x, .tmp2x, ._, ._ },
10164 .{ ._, ._pd, .@"or", .tmp1x, .tmp3x, ._, ._ },
10165 .{ ._, ._pd, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
10166 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
10167 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10168 } },
10169 }, .{
10170 .required_features = .{ .sse, null, null, null },
10171 .src_constraints = .{
10172 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
10173 .{ .multiple_scalar_float = .{ .of = .qword, .is = .qword } },
10174 },
10175 .patterns = &.{
10176 .{ .src = .{ .to_mem, .to_mem } },
10177 },
10178 .call_frame = .{ .alignment = .@"16" },
10179 .extra_temps = .{
10180 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10181 .{ .type = .f64, .kind = .{ .reg = .xmm0 } },
10182 .{ .type = .f64, .kind = .{ .reg = .xmm1 } },
10183 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fmin" } } },
10184 .unused,
10185 .unused,
10186 .unused,
10187 .unused,
10188 .unused,
10189 },
10190 .dst_temps = .{.mem},
10191 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
10192 .each = .{ .once = &.{
10193 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
10194 .{ .@"0:", ._ps, .xor, .tmp1x, .tmp1x, ._, ._ },
10195 .{ ._, ._ps, .xor, .tmp2x, .tmp2x, ._, ._ },
10196 .{ ._, ._ps, .movl, .tmp1x, .memia(.src0q, .tmp0, .add_size), ._, ._ },
10197 .{ ._, ._ps, .movl, .tmp2x, .memia(.src1q, .tmp0, .add_size), ._, ._ },
10198 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
10199 .{ ._, ._ps, .movl, .memia(.dst0q, .tmp0, .add_size), .tmp1q, ._, ._ },
10200 .{ ._, ._, .add, .tmp0q, .si(8), ._, ._ },
10201 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10202 } },
858710203 }, .{
858810204 .required_features = .{ .x87, .cmov, null, null },
858910205 .src_constraints = .{
......@@ -8730,6 +10346,164 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
873010346 .{ ._, .f_, .ld, .src1t, ._, ._, ._ },
873110347 .{ .@"1:", .f_p, .st, .dst0t, ._, ._, ._ },
873210348 } },
10349 }, .{
10350 .required_features = .{ .x87, .cmov, null, null },
10351 .src_constraints = .{
10352 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10353 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10354 },
10355 .patterns = &.{
10356 .{ .src = .{ .to_mem, .to_mem } },
10357 },
10358 .extra_temps = .{
10359 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10360 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10361 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10362 .unused,
10363 .unused,
10364 .unused,
10365 .unused,
10366 .unused,
10367 .unused,
10368 },
10369 .dst_temps = .{.mem},
10370 .clobbers = .{ .eflags = true },
10371 .each = .{ .once = &.{
10372 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
10373 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
10374 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
10375 .{ ._, .f_, .ucomi, .tmp1t, .tmp1t, ._, ._ },
10376 .{ ._, .f_u, .cmov, .tmp1t, .tmp2t, ._, ._ },
10377 .{ ._, .f_, .ucomi, .tmp1t, .tmp2t, ._, ._ },
10378 .{ ._, .f_nb, .cmov, .tmp1t, .tmp2t, ._, ._ },
10379 .{ ._, .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
10380 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
10381 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
10382 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10383 } },
10384 }, .{
10385 .required_features = .{ .sahf, .x87, null, null },
10386 .src_constraints = .{
10387 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10388 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10389 },
10390 .patterns = &.{
10391 .{ .src = .{ .to_mem, .to_mem } },
10392 },
10393 .extra_temps = .{
10394 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10395 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10396 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10397 .{ .type = .u8, .kind = .{ .reg = .ah } },
10398 .unused,
10399 .unused,
10400 .unused,
10401 .unused,
10402 .unused,
10403 },
10404 .dst_temps = .{.mem},
10405 .clobbers = .{ .eflags = true },
10406 .each = .{ .once = &.{
10407 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
10408 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
10409 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
10410 .{ ._, .f_, .ucom, .tmp1t, ._, ._, ._ },
10411 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
10412 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10413 .{ ._, ._p, .j, .@"1f", ._, ._, ._ },
10414 .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ },
10415 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
10416 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10417 .{ ._, ._b, .j, .@"2f", ._, ._, ._ },
10418 .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ },
10419 .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ },
10420 .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
10421 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
10422 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
10423 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10424 } },
10425 }, .{
10426 .required_features = .{ .@"64bit", .x87, null, null },
10427 .src_constraints = .{
10428 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10429 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10430 },
10431 .patterns = &.{
10432 .{ .src = .{ .to_mem, .to_mem } },
10433 },
10434 .extra_temps = .{
10435 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10436 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10437 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10438 .{ .type = .u8, .kind = .{ .reg = .ah } },
10439 .unused,
10440 .unused,
10441 .unused,
10442 .unused,
10443 .unused,
10444 },
10445 .dst_temps = .{.mem},
10446 .clobbers = .{ .eflags = true },
10447 .each = .{ .once = &.{
10448 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
10449 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
10450 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
10451 .{ ._, .f_, .xam, ._, ._, ._, ._ },
10452 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
10453 .{ ._, ._, .@"test", .tmp3b, .si(0b0_1_000_100), ._, ._ },
10454 .{ ._, ._z, .j, .@"1f", ._, ._, ._ },
10455 .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ },
10456 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
10457 .{ ._, ._, .@"test", .tmp3b, .si(0b0_0_000_001), ._, ._ },
10458 .{ ._, ._nz, .j, .@"2f", ._, ._, ._ },
10459 .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ },
10460 .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ },
10461 .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
10462 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
10463 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
10464 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10465 } },
10466 }, .{
10467 .required_features = .{ .x87, null, null, null },
10468 .src_constraints = .{
10469 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10470 .{ .multiple_scalar_float = .{ .of = .xword, .is = .tbyte } },
10471 },
10472 .patterns = &.{
10473 .{ .src = .{ .to_mem, .to_mem } },
10474 },
10475 .extra_temps = .{
10476 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10477 .{ .type = .f80, .kind = .{ .reg = .st6 } },
10478 .{ .type = .f80, .kind = .{ .reg = .st7 } },
10479 .{ .type = .u8, .kind = .{ .reg = .ah } },
10480 .unused,
10481 .unused,
10482 .unused,
10483 .unused,
10484 .unused,
10485 },
10486 .dst_temps = .{.mem},
10487 .clobbers = .{ .eflags = true },
10488 .each = .{ .once = &.{
10489 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_size), ._, ._ },
10490 .{ .@"0:", .f_, .ld, .memia(.src1t, .tmp0, .add_size), ._, ._, ._ },
10491 .{ ._, .f_, .ld, .memia(.src0t, .tmp0, .add_size), ._, ._, ._ },
10492 .{ ._, .f_, .ucom, .tmp1t, ._, ._, ._ },
10493 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
10494 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10495 .{ ._, ._p, .j, .@"1f", ._, ._, ._ },
10496 .{ ._, .f_, .ucom, .tmp2t, ._, ._, ._ },
10497 .{ ._, .fn_sw, .st, .tmp3w, ._, ._, ._ },
10498 .{ ._, ._, .sahf, ._, ._, ._, ._ },
10499 .{ ._, ._b, .j, .@"2f", ._, ._, ._ },
10500 .{ .@"1:", .f_p, .st, .tmp1t, ._, ._, ._ },
10501 .{ ._, .f_, .ld, .tmp2t, ._, ._, ._ },
10502 .{ .@"2:", .f_p, .st, .memia(.dst0t, .tmp0, .add_size), ._, ._, ._ },
10503 .{ ._, .f_p, .st, .tmp2t, ._, ._, ._ },
10504 .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ },
10505 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10506 } },
873310507 }, .{
873410508 .required_features = .{ .sse, null, null, null },
873510509 .src_constraints = .{
......@@ -8751,11 +10525,107 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
875110525 .unused,
875210526 .unused,
875310527 },
8754 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
875510528 .dst_temps = .{.{ .ref = .src0 }},
10529 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
875610530 .each = .{ .once = &.{
875710531 .{ ._, ._, .call, .tmp0d, ._, ._, ._ },
875810532 } },
10533 }, .{
10534 .required_features = .{ .avx, null, null, null },
10535 .src_constraints = .{
10536 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
10537 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
10538 },
10539 .patterns = &.{
10540 .{ .src = .{ .to_mem, .to_mem } },
10541 },
10542 .call_frame = .{ .alignment = .@"16" },
10543 .extra_temps = .{
10544 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10545 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
10546 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
10547 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fminq" } } },
10548 .unused,
10549 .unused,
10550 .unused,
10551 .unused,
10552 .unused,
10553 },
10554 .dst_temps = .{.mem},
10555 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
10556 .each = .{ .once = &.{
10557 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
10558 .{ .@"0:", .v_dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
10559 .{ ._, .v_dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
10560 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
10561 .{ ._, .v_dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
10562 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
10563 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10564 } },
10565 }, .{
10566 .required_features = .{ .sse2, null, null, null },
10567 .src_constraints = .{
10568 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
10569 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
10570 },
10571 .patterns = &.{
10572 .{ .src = .{ .to_mem, .to_mem } },
10573 },
10574 .call_frame = .{ .alignment = .@"16" },
10575 .extra_temps = .{
10576 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10577 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
10578 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
10579 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fminq" } } },
10580 .unused,
10581 .unused,
10582 .unused,
10583 .unused,
10584 .unused,
10585 },
10586 .dst_temps = .{.mem},
10587 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
10588 .each = .{ .once = &.{
10589 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
10590 .{ .@"0:", ._dqa, .mov, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
10591 .{ ._, ._dqa, .mov, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
10592 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
10593 .{ ._, ._dqa, .mov, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
10594 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
10595 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10596 } },
10597 }, .{
10598 .required_features = .{ .sse, null, null, null },
10599 .src_constraints = .{
10600 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
10601 .{ .multiple_scalar_float = .{ .of = .xword, .is = .xword } },
10602 },
10603 .patterns = &.{
10604 .{ .src = .{ .to_mem, .to_mem } },
10605 },
10606 .call_frame = .{ .alignment = .@"16" },
10607 .extra_temps = .{
10608 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
10609 .{ .type = .f128, .kind = .{ .reg = .xmm0 } },
10610 .{ .type = .f128, .kind = .{ .reg = .xmm1 } },
10611 .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "fminq" } } },
10612 .unused,
10613 .unused,
10614 .unused,
10615 .unused,
10616 .unused,
10617 },
10618 .dst_temps = .{.mem},
10619 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
10620 .each = .{ .once = &.{
10621 .{ ._, ._, .mov, .tmp0q, .sa(.src0, .sub_size), ._, ._ },
10622 .{ .@"0:", ._ps, .mova, .tmp1x, .memia(.src0x, .tmp0, .add_size), ._, ._ },
10623 .{ ._, ._ps, .mova, .tmp2x, .memia(.src1x, .tmp0, .add_size), ._, ._ },
10624 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
10625 .{ ._, ._ps, .mova, .memia(.dst0x, .tmp0, .add_size), .tmp1x, ._, ._ },
10626 .{ ._, ._, .add, .tmp0q, .si(16), ._, ._ },
10627 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
10628 } },
875910629 } }) catch |err| switch (err) {
876010630 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
876110631 @tagName(air_tag),
......@@ -8955,7 +10825,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
895510825 },
895610826 .extra_temps = .{
895710827 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8958 .{ .kind = .{ .rc = .sse } },
10828 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
895910829 .unused,
896010830 .unused,
896110831 .unused,
......@@ -8982,7 +10852,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
898210852 },
898310853 .extra_temps = .{
898410854 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
8985 .{ .kind = .{ .rc = .sse } },
10855 .{ .type = .vector_32_u8, .kind = .{ .rc = .sse } },
898610856 .unused,
898710857 .unused,
898810858 .unused,
......@@ -9009,7 +10879,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
900910879 },
901010880 .extra_temps = .{
901110881 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9012 .{ .kind = .{ .rc = .sse } },
10882 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
901310883 .unused,
901410884 .unused,
901510885 .unused,
......@@ -9036,7 +10906,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
903610906 },
903710907 .extra_temps = .{
903810908 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9039 .{ .kind = .{ .rc = .sse } },
10909 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
904010910 .unused,
904110911 .unused,
904210912 .unused,
......@@ -9063,7 +10933,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
906310933 },
906410934 .extra_temps = .{
906510935 .{ .type = .isize, .kind = .{ .rc = .general_purpose } },
9066 .{ .kind = .{ .rc = .sse } },
10936 .{ .type = .vector_16_u8, .kind = .{ .rc = .sse } },
906710937 .unused,
906810938 .unused,
906910939 .unused,
......@@ -15226,8 +17096,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1522617096 .info = .{ .kind = .all, .scalar = .dword },
1522717097 } }},
1522817098 .each = .{ .once = &.{
15229 .{ ._, .v_ps, .cvtph2, .dst0x, .src0x, ._, ._ },
15230 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1x, ._, ._ },
17099 .{ ._, .v_ps, .cvtph2, .dst0x, .src0q, ._, ._ },
17100 .{ ._, .v_ps, .cvtph2, .tmp0x, .src1q, ._, ._ },
1523117101 .{ ._, .v_ss, .cmp, .dst0x, .dst0x, .tmp0x, .vp(switch (cc) {
1523217102 else => unreachable,
1523317103 .e => .eq,
......@@ -15815,7 +17685,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1581517685 .{ .type = .i32, .kind = .{ .reg = .eax } },
1581617686 .{ .type = .u8, .kind = .{ .reg = .cl } },
1581717687 .{ .type = .u32, .kind = .{ .reg = .edx } },
15818 .{ .type = .vector_8_f16, .kind = .mem },
17688 .{ .type = .f32, .kind = .mem },
1581917689 .unused,
1582017690 },
1582117691 .dst_temps = .{.{ .rc = .general_purpose }},
......@@ -15825,10 +17695,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1582517695 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
1582617696 .{ .@"0:", ._, .movzx, .tmp4d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
1582717697 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15828 .{ ._, ._ps, .mova, .tmp1x, .mem(.tmp7x), ._, ._ },
17698 .{ ._, ._ss, .mov, .tmp1x, .mem(.tmp7d), ._, ._ },
1582917699 .{ ._, ._, .movzx, .tmp4d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
1583017700 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15831 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp7x), ._, ._ },
17701 .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp7d), ._, ._ },
1583217702 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
1583317703 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
1583417704 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
......@@ -15863,7 +17733,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1586317733 .{ .type = .i32, .kind = .{ .reg = .eax } },
1586417734 .{ .type = .u8, .kind = .{ .reg = .cl } },
1586517735 .{ .type = .u32, .kind = .{ .reg = .edx } },
15866 .{ .type = .vector_8_f16, .kind = .mem },
17736 .{ .type = .f32, .kind = .mem },
1586717737 .unused,
1586817738 },
1586917739 .dst_temps = .{.{ .rc = .general_purpose }},
......@@ -15873,10 +17743,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1587317743 .{ ._, ._, .xor, .tmp0d, .tmp0d, ._, ._ },
1587417744 .{ .@"0:", ._, .movzx, .tmp4d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
1587517745 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15876 .{ ._, ._ps, .mova, .tmp1x, .mem(.tmp7x), ._, ._ },
17746 .{ ._, ._ss, .mov, .tmp1x, .mem(.tmp7d), ._, ._ },
1587717747 .{ ._, ._, .movzx, .tmp4d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
1587817748 .{ ._, ._, .mov, .mem(.tmp7d), .tmp4d, ._, ._ },
15879 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp7x), ._, ._ },
17749 .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp7d), ._, ._ },
1588017750 .{ ._, ._, .call, .tmp3d, ._, ._, ._ },
1588117751 .{ ._, ._, .xor, .tmp6d, .tmp6d, ._, ._ },
1588217752 .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ },
......@@ -16133,7 +18003,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1613318003 .{ .type = .i32, .kind = .{ .reg = .eax } },
1613418004 .{ .type = .u8, .kind = .{ .reg = .cl } },
1613518005 .{ .type = .u64, .kind = .{ .reg = .rdx } },
16136 .{ .type = .vector_8_f16, .kind = .mem },
18006 .{ .type = .f32, .kind = .mem },
1613718007 },
1613818008 .dst_temps = .{.mem},
1613918009 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
......@@ -16142,10 +18012,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1614218012 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
1614318013 .{ .@"0:", ._, .movzx, .tmp5d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
1614418014 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
16145 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp8x), ._, ._ },
18015 .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp8d), ._, ._ },
1614618016 .{ ._, ._, .movzx, .tmp5d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
1614718017 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
16148 .{ ._, ._ps, .mova, .tmp3x, .mem(.tmp8x), ._, ._ },
18018 .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp8d), ._, ._ },
1614918019 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
1615018020 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
1615118021 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
......@@ -16191,7 +18061,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1619118061 .{ .type = .i32, .kind = .{ .reg = .eax } },
1619218062 .{ .type = .u8, .kind = .{ .reg = .cl } },
1619318063 .{ .type = .u64, .kind = .{ .reg = .rdx } },
16194 .{ .type = .vector_8_f16, .kind = .mem },
18064 .{ .type = .f32, .kind = .mem },
1619518065 },
1619618066 .dst_temps = .{.mem},
1619718067 .clobbers = .{ .eflags = true, .caller_preserved = .ccc },
......@@ -16200,10 +18070,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1620018070 .{ ._, ._, .xor, .tmp1d, .tmp1d, ._, ._ },
1620118071 .{ .@"0:", ._, .movzx, .tmp5d, .memsi(.src0w, .@"2", .tmp0), ._, ._ },
1620218072 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
16203 .{ ._, ._ps, .mova, .tmp2x, .mem(.tmp8x), ._, ._ },
18073 .{ ._, ._ss, .mov, .tmp2x, .mem(.tmp8d), ._, ._ },
1620418074 .{ ._, ._, .movzx, .tmp5d, .memsi(.src1w, .@"2", .tmp0), ._, ._ },
1620518075 .{ ._, ._, .mov, .mem(.tmp8d), .tmp5d, ._, ._ },
16206 .{ ._, ._ps, .mova, .tmp3x, .mem(.tmp8x), ._, ._ },
18076 .{ ._, ._ss, .mov, .tmp3x, .mem(.tmp8d), ._, ._ },
1620718077 .{ ._, ._, .call, .tmp4d, ._, ._, ._ },
1620818078 .{ ._, ._, .xor, .tmp7d, .tmp7d, ._, ._ },
1620918079 .{ ._, ._, .@"test", .tmp5d, .tmp5d, ._, ._ },
......@@ -16482,7 +18352,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1648218352 .{ ._, ._, .@"or", .tmp4b, .tmp5b, ._, ._ },
1648318353 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp4b, ._, ._ },
1648418354 .{ ._, ._, .lea, .tmp1p, .lead(.none, .tmp1, 1), ._, ._ },
16485 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18355 .{ ._, ._, .add, .tmp0p, .si(64), ._, ._ },
1648618356 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
1648718357 } },
1648818358 }, .{
......@@ -16528,7 +18398,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1652818398 .{ ._, ._, .@"or", .tmp4b, .tmp5b, ._, ._ },
1652918399 .{ ._, ._, .mov, .lea(.byte, .tmp1), .tmp4b, ._, ._ },
1653018400 .{ ._, ._c, .in, .tmp1q, ._, ._, ._ },
16531 .{ ._, ._, .add, .tmp0p, .si(32), ._, ._ },
18401 .{ ._, ._, .add, .tmp0p, .si(64), ._, ._ },
1653218402 .{ ._, ._nc, .j, .@"0b", ._, ._, ._ },
1653318403 } },
1653418404 }, .{
......@@ -19809,8 +21679,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
1980921679 } }},
1981021680 .clobbers = .{ .eflags = true },
1981121681 .each = .{ .once = &.{
19812 .{ ._, .v_ps, .cvtph2, .tmp0x, .src0x, ._, ._ },
19813 .{ ._, .v_ps, .cvtph2, .tmp1x, .src1x, ._, ._ },
21682 .{ ._, .v_ps, .cvtph2, .tmp0x, .src0q, ._, ._ },
21683 .{ ._, .v_ps, .cvtph2, .tmp1x, .src1q, ._, ._ },
1981421684 .{ ._, .v_ss, .ucomi, .tmp0x, .tmp1x, ._, ._ },
1981521685 } },
1981621686 }, .{
......@@ -21194,19 +23064,21 @@ fn allocRegOrMemAdvanced(self: *CodeGen, ty: Type, inst: ?Air.Inst.Index, reg_ok
2119423064 };
2119523065
2119623066 if (reg_ok) need_mem: {
21197 if (std.math.isPowerOfTwo(abi_size) and abi_size <= @as(u32, switch (ty.zigTypeTag(zcu)) {
23067 if (std.math.isPowerOfTwo(abi_size) and abi_size <= @as(u32, max_abi_size: switch (ty.zigTypeTag(zcu)) {
2119823068 .float => switch (ty.floatBits(self.target.*)) {
2119923069 16, 32, 64, 128 => 16,
2120023070 80 => break :need_mem,
2120123071 else => unreachable,
2120223072 },
21203 .vector => switch (ty.childType(zcu).zigTypeTag(zcu)) {
21204 .float => switch (ty.childType(zcu).floatBits(self.target.*)) {
23073 .vector => {
23074 const elem_ty = ty.childType(zcu);
23075 break :max_abi_size if (elem_ty.toIntern() == .bool_type)
23076 8
23077 else if (self.floatBits(elem_ty)) |float_bits| switch (float_bits) {
2120523078 16, 32, 64, 128 => self.vectorSize(.float),
2120623079 80 => break :need_mem,
2120723080 else => unreachable,
21208 },
21209 else => self.vectorSize(.int),
23081 } else self.vectorSize(.int);
2121023082 },
2121123083 else => 8,
2121223084 })) {
......@@ -21223,17 +23095,18 @@ fn allocRegOrMemAdvanced(self: *CodeGen, ty: Type, inst: ?Air.Inst.Index, reg_ok
2122323095fn regClassForType(self: *CodeGen, ty: Type) Register.Class {
2122423096 const pt = self.pt;
2122523097 const zcu = pt.zcu;
21226 return switch (ty.zigTypeTag(zcu)) {
21227 .float => switch (ty.floatBits(self.target.*)) {
21228 80 => .x87,
21229 else => .sse,
21230 },
21231 .vector => switch (ty.childType(zcu).toIntern()) {
21232 .bool_type => .general_purpose,
21233 else => .sse,
21234 },
21235 else => .general_purpose,
23098 if (self.floatBits(ty)) |float_bits| return switch (float_bits) {
23099 80 => .x87,
23100 else => .sse,
2123623101 };
23102 if (!ty.isVector(zcu)) return .general_purpose;
23103 const elem_ty = ty.childType(zcu);
23104 return if (elem_ty.toIntern() == .bool_type)
23105 .general_purpose
23106 else if (self.floatBits(elem_ty) == 80)
23107 .x87
23108 else
23109 .sse;
2123723110}
2123823111
2123923112fn regSetForRegClass(rc: Register.Class) RegisterManager.RegisterBitSet {
......@@ -33370,10 +35243,21 @@ const MoveStrategy = union(enum) {
3337035243 else => dst_reg,
3337135244 .lea => if (dst_reg.bitSize() >= 32) dst_reg else dst_reg.to32(),
3337235245 }, src_mem),
33373 .x87_load_store => {
35246 .x87_load_store => if (dst_reg != .st0 and self.register_manager.isKnownRegFree(.st7)) {
35247 try self.asmMemory(.{ .f_, .ld }, src_mem);
35248 switch (dst_reg) {
35249 .st1, .st2, .st3, .st4, .st5, .st6 => try self.asmRegister(.{ .f_p, .st }, @enumFromInt(@intFromEnum(dst_reg) + 1)),
35250 .st7 => try self.asmOpOnly(.{ .f_cstp, .in }),
35251 else => unreachable,
35252 }
35253 } else {
35254 try self.asmRegister(.{ .f_p, .st }, dst_reg);
3337435255 try self.asmMemory(.{ .f_, .ld }, src_mem);
33375 assert(dst_reg != .st7);
33376 try self.asmRegister(.{ .f_p, .st }, @enumFromInt(@intFromEnum(dst_reg) + 1));
35256 switch (dst_reg) {
35257 .st0 => {},
35258 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try self.asmRegister(.{ .f_, .xch }, dst_reg),
35259 else => unreachable,
35260 }
3337735261 },
3337835262 .insert_extract => |ie| if (ie.insert[0] != .p_w or self.hasFeature(.sse2))
3337935263 try self.asmRegisterMemoryImmediate(ie.insert, dst_reg, src_mem, .u(0))
......@@ -33405,9 +35289,22 @@ const MoveStrategy = union(enum) {
3340535289 pub fn write(strat: MoveStrategy, self: *CodeGen, dst_mem: Memory, src_reg: Register) !void {
3340635290 switch (strat) {
3340735291 .move => |tag| try self.asmMemoryRegister(tag, dst_mem, src_reg),
33408 .x87_load_store => {
35292 .x87_load_store => if (self.register_manager.isKnownRegFree(.st7)) {
3340935293 try self.asmRegister(.{ .f_, .ld }, src_reg);
3341035294 try self.asmMemory(.{ .f_p, .st }, dst_mem);
35295 } else {
35296 switch (src_reg) {
35297 .st0 => {},
35298 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try self.asmRegister(.{ .f_, .xch }, src_reg),
35299 else => unreachable,
35300 }
35301 try self.asmMemory(.{ .f_p, .st }, dst_mem);
35302 try self.asmMemory(.{ .f_, .ld }, dst_mem);
35303 switch (src_reg) {
35304 .st0 => {},
35305 .st1, .st2, .st3, .st4, .st5, .st6, .st7 => try self.asmRegister(.{ .f_, .xch }, src_reg),
35306 else => unreachable,
35307 }
3341135308 },
3341235309 .insert_extract, .vex_insert_extract => |ie| if (ie.extract[0] != .p_w or self.hasFeature(.sse4_1))
3341335310 try self.asmMemoryRegisterImmediate(ie.extract, dst_mem, src_reg, .u(0))
......@@ -33964,10 +35861,25 @@ fn genSetReg(
3396435861 .general_purpose, .segment => unreachable,
3396535862 .x87 => switch (src_reg) {
3396635863 .st0 => try self.asmRegister(.{ .f_, .st }, dst_reg),
33967 .st1, .st2, .st3, .st4, .st5, .st6 => {
33968 try self.asmRegister(.{ .f_, .ld }, src_reg);
33969 assert(dst_reg != .st7);
33970 try self.asmRegister(.{ .f_p, .st }, @enumFromInt(@intFromEnum(dst_reg) + 1));
35864 .st1, .st2, .st3, .st4, .st5, .st6 => switch (dst_reg) {
35865 .st0 => {
35866 try self.asmRegister(.{ .f_p, .st }, .st0);
35867 try self.asmRegister(.{ .f_, .ld }, @enumFromInt(@intFromEnum(src_reg) - 1));
35868 },
35869 .st2, .st3, .st4, .st5, .st6 => if (self.register_manager.isKnownRegFree(.st7)) {
35870 try self.asmRegister(.{ .f_, .ld }, src_reg);
35871 try self.asmRegister(.{ .f_p, .st }, @enumFromInt(@intFromEnum(dst_reg) + 1));
35872 } else {
35873 try self.asmRegister(.{ .f_, .xch }, src_reg);
35874 try self.asmRegister(.{ .f_, .xch }, dst_reg);
35875 try self.asmRegister(.{ .f_, .xch }, src_reg);
35876 },
35877 .st7 => {
35878 if (!self.register_manager.isKnownRegFree(.st7)) try self.asmRegister(.{ .f_, .free }, dst_reg);
35879 try self.asmRegister(.{ .f_, .ld }, src_reg);
35880 try self.asmOpOnly(.{ .f_cstp, .in });
35881 },
35882 else => unreachable,
3397135883 },
3397235884 else => unreachable,
3397335885 },
......@@ -33993,10 +35905,14 @@ fn genSetReg(
3399335905 .base = .{ .frame = frame_index },
3399435906 .mod = .{ .rm = .{ .size = .fromSize(abi_size) } },
3399535907 }, registerAlias(src_reg, abi_size));
35908 switch (frame_size) {
35909 else => {},
35910 8 => try self.asmRegisterRegister(.{ ._ps, .xor }, dst_reg.to128(), dst_reg.to128()),
35911 }
3399635912 try self.asmRegisterMemory(switch (frame_size) {
3399735913 4 => .{ ._ss, .mov },
3399835914 8 => .{ ._ps, .movl },
33999 16 => .{ ._ps, .mov },
35915 16 => .{ ._ps, .mova },
3400035916 else => unreachable,
3400135917 }, dst_reg.to128(), .{
3400235918 .base = .{ .frame = frame_index },
......@@ -34009,7 +35925,26 @@ fn genSetReg(
3400935925 .{ .register = try self.copyToTmpRegister(ty, src_mcv) },
3401035926 opts,
3401135927 ),
34012 .x87, .mmx, .ip, .cr, .dr => unreachable,
35928 .x87 => {
35929 const frame_index = try self.allocFrameIndex(.init(.{
35930 .size = 16,
35931 .alignment = .@"16",
35932 }));
35933 try MoveStrategy.write(.x87_load_store, self, .{
35934 .base = .{ .frame = frame_index },
35935 .mod = .{ .rm = .{ .size = .tbyte } },
35936 }, src_reg);
35937 try self.asmRegisterMemory(if (self.hasFeature(.avx))
35938 .{ .v_dqa, .mov }
35939 else if (self.hasFeature(.sse2))
35940 .{ ._dqa, .mov }
35941 else
35942 .{ ._ps, .mova }, dst_reg.to128(), .{
35943 .base = .{ .frame = frame_index },
35944 .mod = .{ .rm = .{ .size = .xword } },
35945 });
35946 },
35947 .mmx, .ip, .cr, .dr => unreachable,
3401335948 .sse => try self.asmRegisterRegister(
3401435949 @as(?Mir.Inst.FixedTag, switch (ty.scalarType(zcu).zigTypeTag(zcu)) {
3401535950 else => switch (abi_size) {
......@@ -38510,7 +40445,7 @@ fn resolveCallingConventionValues(
3851040445 else if (ret_gpr.len >= 2 and ret_ty.isSliceAtRuntime(zcu))
3851140446 break :return_value .init(.{ .register_pair = ret_gpr[0..2].* }),
3851240447 .segment, .mmx, .ip, .cr, .dr => unreachable,
38513 .x87 => break :return_value .init(.{ .register = .st0 }),
40448 .x87 => if (ret_size <= 16) break :return_value .init(.{ .register = .st0 }),
3851440449 .sse => if (ret_size <= self.vectorSize(.float)) break :return_value .init(.{
3851540450 .register = registerAlias(abi.getCAbiSseReturnRegs(cc)[0], @max(ret_size, 16)),
3851640451 }),
......@@ -38545,7 +40480,7 @@ fn resolveCallingConventionValues(
3854540480 continue;
3854640481 },
3854740482 .segment, .mmx, .ip, .cr, .dr => unreachable,
38548 .x87 => if (param_x87.len >= 1) {
40483 .x87 => if (param_x87.len >= 1 and param_size <= 16) {
3854940484 arg.* = .{ .register = param_x87[0] };
3855040485 param_x87 = param_x87[1..];
3855140486 continue;
......@@ -38656,10 +40591,12 @@ fn registerAlias(reg: Register, size_bytes: u32) Register {
3865640591
3865740592fn memSize(self: *CodeGen, ty: Type) Memory.Size {
3865840593 const zcu = self.pt.zcu;
38659 return switch (ty.zigTypeTag(zcu)) {
38660 .float => .fromBitSize(ty.floatBits(self.target.*)),
38661 else => .fromSize(@intCast(ty.abiSize(zcu))),
38662 };
40594 return if (self.floatBits(ty)) |float_bits|
40595 .fromBitSize(float_bits)
40596 else if (ty.isVector(zcu) and ty.vectorLen(zcu) == 1 and self.floatBits(ty.childType(zcu)) == 80)
40597 .tbyte
40598 else
40599 .fromSize(@intCast(ty.abiSize(zcu)));
3866340600}
3866440601
3866540602fn splitType(self: *CodeGen, comptime parts_len: usize, ty: Type) ![parts_len]Type {
......@@ -40762,7 +42699,7 @@ const Select = struct {
4076242699 Select.Operand,
4076342700 Select.Operand,
4076442701 };
40765 const Label = enum { @"0:", @"1:", @"_" };
42702 const Label = enum { @"0:", @"1:", @"2:", @"_" };
4076642703 const Operand = struct {
4076742704 tag: Tag,
4076842705 base: Ref.Sized = .none,
......@@ -40992,6 +42929,8 @@ const Select = struct {
4099242929 const @"0f": Select.Operand = .{ .tag = .forward_label, .base = .{ .ref = .tmp0, .size = .none } };
4099342930 const @"1b": Select.Operand = .{ .tag = .backward_label, .base = .{ .ref = .tmp1, .size = .none } };
4099442931 const @"1f": Select.Operand = .{ .tag = .forward_label, .base = .{ .ref = .tmp1, .size = .none } };
42932 const @"2b": Select.Operand = .{ .tag = .backward_label, .base = .{ .ref = .tmp2, .size = .none } };
42933 const @"2f": Select.Operand = .{ .tag = .forward_label, .base = .{ .ref = .tmp2, .size = .none } };
4099542934
4099642935 const tmp0b: Select.Operand = .{ .tag = .ref, .base = .tmp0b };
4099742936 const tmp0w: Select.Operand = .{ .tag = .ref, .base = .tmp0w };
test/behavior/x86_64/math.zig+392
......@@ -3781,6 +3781,396 @@ fn binary(comptime op: anytype, comptime opts: struct { strict: bool = false })
37813781 0xf1e3bbe031d59351770a7a501b6e969b2c00d144f17648db3f944b69dfeb7be72e5ff933a061eba4eaa422f8ca09e5a97d0b0dd740fd4076eba8c72d7a278523f399202dc2d043c4e0eb58a2bcd4066e2146e321810b1ee4d3afdddb4f026bcc7905ce17e033a7727b4e08f33b53c63d8c9f763fc6c31d0523eb38c30d5e40bc,
37823782 });
37833783 }
3784 fn testFloatVectorTypes() !void {
3785 @setEvalBranchQuota(21_700);
3786
3787 try testArgs(@Vector(1, f16), .{
3788 -tmin(f16),
3789 }, .{
3790 fmax(f16),
3791 });
3792 try testArgs(@Vector(2, f16), .{
3793 0.1, 1.0,
3794 }, .{
3795 -nan(f16), -fmin(f16),
3796 });
3797 try testArgs(@Vector(4, f16), .{
3798 0.1, -fmax(f16), 0.0, 0.1,
3799 }, .{
3800 -fmin(f16), -10.0, 1.0, -tmin(f16),
3801 });
3802 try testArgs(@Vector(8, f16), .{
3803 -fmax(f16), -fmin(f16), -nan(f16), -0.0, tmin(f16), -0.0, 0.0, 0.1,
3804 }, .{
3805 -1.0, tmin(f16), nan(f16), nan(f16), -fmax(f16), -10.0, -nan(f16), 10.0,
3806 });
3807 try testArgs(@Vector(16, f16), .{
3808 0.1, fmax(f16), -10.0, fmax(f16), -10.0, 0.1, -tmin(f16), -inf(f16), -tmin(f16), -1.0, -fmin(f16), tmin(f16), 10.0, -fmax(f16), 0.0, -fmin(f16),
3809 }, .{
3810 inf(f16), -10.0, -fmax(f16), fmax(f16), -tmin(f16), 0.0, -1.0, -1.0, 0.1, -nan(f16), -tmin(f16), 1.0, 0.1, fmax(f16), -0.0, inf(f16),
3811 });
3812 try testArgs(@Vector(32, f16), .{
3813 -inf(f16), tmin(f16), fmin(f16), -nan(f16), nan(f16), 0.1, 0.0, 10.0, -tmin(f16), inf(f16), 1.0, -10.0, fmin(f16), -0.0, 1.0, -fmax(f16),
3814 10.0, -0.0, -10.0, -tmin(f16), fmax(f16), nan(f16), -fmin(f16), -1.0, 0.0, -10.0, -nan(f16), 1.0, -tmin(f16), -0.0, nan(f16), 10.0,
3815 }, .{
3816 0.0, 10.0, -nan(f16), -0.0, tmin(f16), fmax(f16), nan(f16), tmin(f16), -10.0, 0.1, 10.0, fmin(f16), -fmax(f16), inf(f16), inf(f16), -tmin(f16),
3817 inf(f16), -0.0, 0.1, 0.0, -fmin(f16), -0.0, -nan(f16), -inf(f16), -fmin(f16), fmax(f16), 1.0, fmin(f16), -0.0, -tmin(f16), -fmax(f16), -10.0,
3818 });
3819 try testArgs(@Vector(64, f16), .{
3820 -nan(f16), fmin(f16), -inf(f16), inf(f16), -tmin(f16), inf(f16), 0.1, -1.0, -inf(f16), nan(f16), -fmin(f16), 0.1, -tmin(f16), -fmax(f16), -10.0, inf(f16),
3821 0.0, -fmin(f16), -fmax(f16), 10.0, -fmax(f16), fmax(f16), 10.0, fmin(f16), -inf(f16), -nan(f16), -tmin(f16), nan(f16), -0.0, 0.0, 0.1, -fmin(f16),
3822 0.0, nan(f16), inf(f16), fmax(f16), nan(f16), tmin(f16), 1.0, tmin(f16), fmin(f16), -10.0, 0.0, 0.1, inf(f16), -10.0, inf(f16), 1.0,
3823 0.1, -inf(f16), 10.0, -0.0, -1.0, -tmin(f16), -nan(f16), 0.1, 0.1, -nan(f16), -0.0, -10.0, -0.0, -nan(f16), 0.1, fmin(f16),
3824 }, .{
3825 10.0, 0.0, fmax(f16), -inf(f16), -fmax(f16), -fmax(f16), tmin(f16), -1.0, -tmin(f16), -10.0, nan(f16), -nan(f16), tmin(f16), -fmin(f16), nan(f16), -10.0,
3826 10.0, fmax(f16), 0.1, 0.0, 0.1, -fmax(f16), -0.0, -fmin(f16), inf(f16), -1.0, inf(f16), fmin(f16), -inf(f16), -tmin(f16), 10.0, 10.0,
3827 0.1, 0.1, 0.1, 10.0, -fmin(f16), inf(f16), 0.1, fmax(f16), inf(f16), -0.0, -10.0, tmin(f16), -fmin(f16), 0.0, 10.0, 0.0,
3828 -tmin(f16), -inf(f16), 1.0, -fmax(f16), inf(f16), 10.0, fmax(f16), -1.0, 0.0, 0.1, -1.0, -inf(f16), 0.1, 0.0, -10.0, fmax(f16),
3829 });
3830 try testArgs(@Vector(128, f16), .{
3831 -fmin(f16), 1.0, 0.0, 0.1, nan(f16), 0.1, 0.1, -inf(f16), -tmin(f16), 1.0, -fmin(f16), -fmax(f16), -1.0, -fmin(f16), 10.0, -nan(f16),
3832 inf(f16), -inf(f16), tmin(f16), -10.0, -1.0, -0.0, -0.0, 1.0, nan(f16), -10.0, fmin(f16), -tmin(f16), tmin(f16), 0.1, -fmax(f16), fmax(f16),
3833 tmin(f16), -fmin(f16), nan(f16), 10.0, 1.0, -fmin(f16), 0.1, 10.0, fmax(f16), fmax(f16), fmax(f16), -1.0, -nan(f16), 10.0, tmin(f16), -nan(f16),
3834 -nan(f16), -inf(f16), -0.0, -inf(f16), nan(f16), -1.0, 0.1, -fmax(f16), -10.0, nan(f16), 1.0, -10.0, tmin(f16), 1.0, 0.1, 1.0,
3835 10.0, 0.1, tmin(f16), nan(f16), -inf(f16), -1.0, -1.0, -fmax(f16), -inf(f16), 0.1, 0.1, -0.0, 10.0, fmin(f16), -1.0, inf(f16),
3836 0.1, -10.0, inf(f16), -0.0, 0.1, 0.0, inf(f16), 1.0, tmin(f16), -tmin(f16), 0.1, inf(f16), tmin(f16), -inf(f16), 10.0, 1.0,
3837 -inf(f16), 0.1, 1.0, fmax(f16), -fmin(f16), nan(f16), -nan(f16), fmin(f16), -1.0, -fmax(f16), inf(f16), -fmax(f16), 0.0, -10.0, fmin(f16), -fmax(f16),
3838 -0.0, -1.0, 0.1, 10.0, inf(f16), fmax(f16), inf(f16), 10.0, fmax(f16), -0.0, -tmin(f16), fmin(f16), inf(f16), nan(f16), -fmin(f16), -1.0,
3839 }, .{
3840 -fmax(f16), fmax(f16), inf(f16), 1.0, nan(f16), 0.1, -fmax(f16), 10.0, -fmin(f16), 0.1, fmin(f16), -0.0, 0.1, -0.0, -nan(f16), -nan(f16),
3841 inf(f16), 1.0, -1.0, 0.1, 0.1, 0.1, 0.0, -tmin(f16), -1.0, -10.0, -tmin(f16), 1.0, -10.0, fmin(f16), -fmax(f16), -nan(f16),
3842 -tmin(f16), -inf(f16), inf(f16), -fmin(f16), -nan(f16), 0.0, -inf(f16), -fmax(f16), 0.1, -inf(f16), tmin(f16), nan(f16), tmin(f16), fmin(f16), -0.0, 0.1,
3843 fmin(f16), fmin(f16), 1.0, tmin(f16), 0.0, 10.0, 0.1, inf(f16), 10.0, -tmin(f16), tmin(f16), -1.0, -fmin(f16), 1.0, nan(f16), -fmax(f16),
3844 nan(f16), -fmin(f16), 0.1, 10.0, -10.0, 1.0, -0.0, tmin(f16), nan(f16), inf(f16), -fmax(f16), tmin(f16), -tmin(f16), 10.0, fmin(f16), -tmin(f16),
3845 -0.0, 1.0, tmin(f16), fmax(f16), 1.0, -inf(f16), -nan(f16), -0.0, 0.1, -inf(f16), 0.1, fmax(f16), -inf(f16), -nan(f16), -1.0, -inf(f16),
3846 0.1, fmin(f16), -10.0, -tmin(f16), 1.0, -nan(f16), -fmax(f16), -10.0, -tmin(f16), 10.0, nan(f16), fmin(f16), fmax(f16), tmin(f16), -inf(f16), 1.0,
3847 -fmin(f16), tmin(f16), -1.0, 0.1, 0.0, nan(f16), 1.0, fmax(f16), -1.0, 10.0, nan(f16), 1.0, fmin(f16), 1.0, -10.0, -10.0,
3848 });
3849 try testArgs(@Vector(69, f16), .{
3850 -nan(f16), -1.0, -fmin(f16), fmin(f16), inf(f16), 0.1, 0.0, fmax(f16), tmin(f16), 0.1, 0.0, -tmin(f16), 0.0, 0.0, 1.0, -inf(f16),
3851 tmin(f16), -inf(f16), -tmin(f16), fmin(f16), -inf(f16), -nan(f16), tmin(f16), -tmin(f16), 0.1, -1.0, -tmin(f16), fmax(f16), nan(f16), -fmin(f16), fmin(f16), 10.0,
3852 fmin(f16), -10.0, 0.0, fmin(f16), fmax(f16), -nan(f16), fmax(f16), -fmax(f16), nan(f16), -nan(f16), fmin(f16), -10.0, -fmin(f16), fmin(f16), -fmin(f16), -nan(f16),
3853 0.0, -1.0, fmax(f16), 0.1, inf(f16), 1.0, -1.0, -0.0, 10.0, 0.1, -fmax(f16), tmin(f16), -inf(f16), tmin(f16), -fmax(f16), 0.1,
3854 -10.0, -0.0, -fmax(f16), nan(f16), fmax(f16),
3855 }, .{
3856 inf(f16), -fmin(f16), 0.1, 0.1, -0.0, fmax(f16), 0.1, -0.0, 0.0, -0.0, 0.0, -tmin(f16), tmin(f16), -1.0, nan(f16), -fmin(f16),
3857 fmin(f16), 0.1, 0.1, nan(f16), -fmax(f16), -inf(f16), -nan(f16), -nan(f16), 0.1, -fmax(f16), fmin(f16), 0.1, 0.1, 0.1, -0.0, 10.0,
3858 tmin(f16), -nan(f16), fmin(f16), -1.0, 1.0, -tmin(f16), 0.0, nan(f16), fmax(f16), -10.0, fmin(f16), -fmin(f16), -1.0, 0.1, -fmin(f16), -fmin(f16),
3859 -fmax(f16), 0.0, fmin(f16), -10.0, -1.0, -1.0, fmax(f16), -nan(f16), -inf(f16), -inf(f16), 0.0, tmin(f16), -0.0, nan(f16), -inf(f16), nan(f16),
3860 inf(f16), fmin(f16), -nan(f16), -inf(f16), inf(f16),
3861 });
3862
3863 try testArgs(@Vector(1, f32), .{
3864 fmin(f32),
3865 }, .{
3866 -tmin(f32),
3867 });
3868 try testArgs(@Vector(2, f32), .{
3869 nan(f32), -10.0,
3870 }, .{
3871 -tmin(f32), fmin(f32),
3872 });
3873 try testArgs(@Vector(4, f32), .{
3874 fmax(f32), -fmax(f32), -10.0, 0.0,
3875 }, .{
3876 inf(f32), inf(f32), -10.0, inf(f32),
3877 });
3878 try testArgs(@Vector(8, f32), .{
3879 -10.0, fmax(f32), inf(f32), -0.0, -tmin(f32), -tmin(f32), 10.0, 0.1,
3880 }, .{
3881 10.0, -1.0, -1.0, inf(f32), 1.0, -tmin(f32), nan(f32), 10.0,
3882 });
3883 try testArgs(@Vector(16, f32), .{
3884 0.1, 0.1, -nan(f32), -10.0, -nan(f32), 0.0, fmin(f32), fmin(f32), -10.0, 1.0, -fmax(f32), -0.0, inf(f32), -0.0, fmax(f32), -fmin(f32),
3885 }, .{
3886 nan(f32), 0.0, tmin(f32), -1.0, -10.0, -tmin(f32), fmin(f32), -fmax(f32), 0.1, 0.1, -inf(f32), tmin(f32), -0.0, 10.0, -0.0, -inf(f32),
3887 });
3888 try testArgs(@Vector(32, f32), .{
3889 0.1, tmin(f32), -1.0, 1.0, tmin(f32), -10.0, fmax(f32), 0.0, tmin(f32), 0.1, -1.0, fmax(f32), -nan(f32), -0.0, fmin(f32), 0.0,
3890 -fmax(f32), fmax(f32), -fmin(f32), -inf(f32), tmin(f32), -nan(f32), -1.0, tmin(f32), -fmin(f32), -inf(f32), nan(f32), -tmin(f32), inf(f32), -inf(f32), -nan(f32), 0.1,
3891 }, .{
3892 -fmin(f32), -1.0, fmax(f32), inf(f32), -fmin(f32), fmax(f32), 0.0, -10.0, 0.0, 0.1, fmin(f32), -inf(f32), 1.0, -nan(f32), -nan(f32),
3893 -inf(f32), -0.0, nan(f32), -fmax(f32), 10.0, -tmin(f32), fmax(f32), -10.0, 0.1, tmin(f32), 0.1, -fmax(f32), 0.0, 0.1, -nan(f32),
3894 -fmin(f32), fmax(f32),
3895 });
3896 try testArgs(@Vector(64, f32), .{
3897 fmin(f32), 0.0, -inf(f32), 0.1, -10.0, -fmin(f32), 10.0, nan(f32), 0.1, 1.0, -1.0, 10.0, 10.0, 0.1, -fmax(f32), -1.0,
3898 -fmin(f32), 0.1, -inf(f32), -inf(f32), 0.1, 0.1, 0.0, -1.0, nan(f32), -0.0, -0.0, -fmin(f32), -inf(f32), inf(f32), tmin(f32), -nan(f32),
3899 0.1, 0.0, 1.0, tmin(f32), 10.0, fmin(f32), -fmin(f32), fmax(f32), nan(f32), 1.0, -nan(f32), -nan(f32), 1.0, nan(f32), 1.0, fmax(f32),
3900 -0.0, 0.0, inf(f32), nan(f32), tmin(f32), 0.0, fmin(f32), -0.0, -fmin(f32), tmin(f32), -1.0, -10.0, 0.1, -tmin(f32), -inf(f32), -1.0,
3901 }, .{
3902 nan(f32), -nan(f32), -tmin(f32), inf(f32), -inf(f32), 0.1, 0.1, 0.1, -1.0, -inf(f32), -0.0, fmax(f32), tmin(f32), -nan(f32), -fmax(f32), -1.0,
3903 -fmin(f32), -0.0, fmax(f32), -fmax(f32), 1.0, -0.0, 0.0, 10.0, -1.0, -fmin(f32), 0.0, fmax(f32), 0.1, 1.0, 10.0, 0.1,
3904 0.1, fmin(f32), -nan(f32), -inf(f32), -0.0, -inf(f32), 0.1, -fmax(f32), -10.0, -10.0, nan(f32), 10.0, -1.0, -fmin(f32), 10.0, fmin(f32),
3905 1.0, -fmax(f32), nan(f32), inf(f32), fmax(f32), fmax(f32), -fmin(f32), -inf(f32), -tmin(f32), -nan(f32), nan(f32), nan(f32), 0.1, 0.1, -1.0, inf(f32),
3906 });
3907 try testArgs(@Vector(128, f32), .{
3908 -10.0, -nan(f32), inf(f32), inf(f32), -tmin(f32), -0.0, 0.0, 0.1, -0.0, fmin(f32), nan(f32), -1.0, nan(f32), -fmax(f32), nan(f32), 0.0,
3909 1.0, -tmin(f32), 0.0, -nan(f32), 0.1, 0.1, -1.0, 10.0, -fmax(f32), -fmin(f32), 0.1, nan(f32), 0.1, -fmax(f32), -tmin(f32), -inf(f32),
3910 inf(f32), tmin(f32), -tmin(f32), nan(f32), -inf(f32), -10.0, 1.0, -nan(f32), 0.1, nan(f32), -1.0, tmin(f32), -fmin(f32), -0.0, -0.0, 1.0,
3911 fmin(f32), -fmin(f32), 0.1, 0.1, 0.1, -10.0, -10.0, -tmin(f32), 1.0, -0.0, 10.0, -fmax(f32), 10.0, -fmax(f32), inf(f32), -1.0,
3912 -fmax(f32), fmin(f32), fmin(f32), fmin(f32), -1.0, -nan(f32), fmax(f32), -nan(f32), 0.1, -1.0, -fmax(f32), -tmin(f32), -0.0, fmax(f32), -10.0, inf(f32),
3913 10.0, -inf(f32), 0.1, fmin(f32), nan(f32), -fmax(f32), -tmin(f32), inf(f32), tmin(f32), -fmin(f32), fmax(f32), 1.0, fmin(f32), -0.0, 0.1, fmin(f32),
3914 0.1, inf(f32), -10.0, inf(f32), 10.0, tmin(f32), 0.0, 1.0, inf(f32), -10.0, -fmin(f32), tmin(f32), 1.0, 0.1, 0.1, -fmin(f32),
3915 10.0, 0.1, fmax(f32), fmin(f32), 1.0, -10.0, -inf(f32), -10.0, 0.0, -fmax(f32), -inf(f32), -1.0, fmax(f32), -tmin(f32), inf(f32), nan(f32),
3916 }, .{
3917 -tmin(f32), -fmax(f32), -fmax(f32), 10.0, inf(f32), 0.1, 1.0, fmin(f32), 0.1, 10.0, fmin(f32), -fmax(f32), 1.0, fmax(f32), 0.1, -fmin(f32),
3918 0.0, -0.0, -0.0, -1.0, -nan(f32), nan(f32), -tmin(f32), 10.0, -tmin(f32), -10.0, inf(f32), 0.0, tmin(f32), 0.0, -fmax(f32), inf(f32),
3919 fmin(f32), 0.1, -10.0, tmin(f32), tmin(f32), 0.1, fmin(f32), -tmin(f32), fmin(f32), nan(f32), 0.1, -fmax(f32), -1.0, -0.0, fmin(f32), -0.0,
3920 -1.0, -0.0, -inf(f32), fmax(f32), -10.0, 1.0, inf(f32), -1.0, -tmin(f32), -tmin(f32), 0.1, -10.0, -fmin(f32), 10.0, -10.0, -inf(f32),
3921 -1.0, inf(f32), 0.1, 1.0, -nan(f32), 0.1, -10.0, -nan(f32), -tmin(f32), 0.0, fmin(f32), -nan(f32), fmax(f32), -tmin(f32), 0.0, 0.0,
3922 -fmax(f32), -inf(f32), -1.0, -0.0, 10.0, nan(f32), 0.1, tmin(f32), -10.0, 10.0, tmin(f32), -fmax(f32), 0.1, -10.0, -tmin(f32), fmax(f32),
3923 -fmax(f32), 0.1, -nan(f32), -fmin(f32), inf(f32), inf(f32), tmin(f32), tmin(f32), -tmin(f32), tmin(f32), 0.0, -0.0, 1.0, 10.0, -10.0, inf(f32),
3924 0.0, -fmin(f32), fmax(f32), -10.0, fmax(f32), -0.0, 0.0, -fmin(f32), 10.0, -fmin(f32), -fmin(f32), -fmin(f32), 10.0, fmin(f32), -inf(f32), fmax(f32),
3925 });
3926 try testArgs(@Vector(69, f32), .{
3927 nan(f32), 0.1, -tmin(f32), fmax(f32), nan(f32), -fmax(f32), 0.1, fmax(f32), 10.0, inf(f32), -fmin(f32), -fmax(f32), inf(f32), -nan(f32), 0.1, 1.0,
3928 fmax(f32), 0.1, 10.0, 0.0, -10.0, fmax(f32), 10.0, 0.0, 1.0, 10.0, -fmax(f32), 0.0, -tmin(f32), -fmin(f32), 0.1, 1.0,
3929 fmin(f32), tmin(f32), -fmin(f32), -tmin(f32), tmin(f32), -inf(f32), -fmax(f32), -0.0, -1.0, -0.0, -fmax(f32), fmax(f32), fmin(f32), -0.0, 0.0, -inf(f32),
3930 -tmin(f32), inf(f32), -nan(f32), tmin(f32), -1.0, -tmin(f32), 10.0, -inf(f32), -fmin(f32), 0.1, -inf(f32), -1.0, nan(f32), -inf(f32), -tmin(f32), 10.0,
3931 10.0, -nan(f32), -nan(f32), tmin(f32), -nan(f32),
3932 }, .{
3933 -nan(f32), 1.0, fmax(f32), 0.1, -0.0, 1.0, -inf(f32), -fmin(f32), -nan(f32), inf(f32), 1.0, -nan(f32), -nan(f32), -inf(f32), tmin(f32), -fmin(f32),
3934 -nan(f32), 0.1, fmin(f32), -1.0, -fmax(f32), 0.1, -1.0, 0.1, 0.1, -tmin(f32), 0.1, 0.1, 10.0, fmin(f32), 0.0, nan(f32),
3935 tmin(f32), 1.0, nan(f32), -fmin(f32), tmin(f32), nan(f32), 0.1, nan(f32), 1.0, -fmax(f32), tmin(f32), 1.0, 0.0, -1.0, nan(f32), fmin(f32),
3936 -inf(f32), fmax(f32), -0.0, nan(f32), tmin(f32), tmin(f32), -inf(f32), -10.0, -nan(f32), -fmax(f32), -0.0, 0.1, -inf(f32), 1.0, nan(f32), 1.0,
3937 -10.0, fmin(f32), inf(f32), fmin(f32), 0.0,
3938 });
3939
3940 try testArgs(@Vector(1, f64), .{
3941 -0.0,
3942 }, .{
3943 1.0,
3944 });
3945 try testArgs(@Vector(2, f64), .{
3946 -1.0, 0.0,
3947 }, .{
3948 -inf(f64), -fmax(f64),
3949 });
3950 try testArgs(@Vector(4, f64), .{
3951 -inf(f64), inf(f64), 10.0, 0.0,
3952 }, .{
3953 -tmin(f64), 1.0, nan(f64), 0.0,
3954 });
3955 try testArgs(@Vector(8, f64), .{
3956 0.1, -tmin(f64), -fmax(f64), 1.0, inf(f64), -10.0, -tmin(f64), -10.0,
3957 }, .{
3958 tmin(f64), fmin(f64), 0.1, 10.0, -0.0, -0.0, fmax(f64), -1.0,
3959 });
3960 try testArgs(@Vector(16, f64), .{
3961 0.1, -nan(f64), 1.0, tmin(f64), fmax(f64), -fmax(f64), -tmin(f64), -0.0, -fmin(f64), -1.0, -fmax(f64), -nan(f64), -fmax(f64), nan(f64), -0.0, 0.1,
3962 }, .{
3963 -1.0, -tmin(f64), -fmin(f64), 0.1, 0.1, -0.0, -nan(f64), -inf(f64), -inf(f64), -0.0, nan(f64), tmin(f64), 1.0, 0.1, tmin(f64), fmin(f64),
3964 });
3965 try testArgs(@Vector(32, f64), .{
3966 -fmax(f64), fmin(f64), 0.1, 0.1, 0.0, 1.0, -0.0, -tmin(f64), tmin(f64), inf(f64), -tmin(f64), -tmin(f64), -tmin(f64), -fmax(f64), fmin(f64), 1.0,
3967 -fmin(f64), -nan(f64), 1.0, -inf(f64), -nan(f64), -1.0, 0.0, 0.0, nan(f64), -nan(f64), -fmin(f64), fmin(f64), 0.1, nan(f64), tmin(f64), -fmax(f64),
3968 }, .{
3969 -tmin(f64), -fmax(f64), -inf(f64), -nan(f64), fmin(f64), -inf(f64), 0.1, -fmax(f64), -inf(f64), fmin(f64), inf(f64), -1.0, -tmin(f64), inf(f64), 0.1, nan(f64),
3970 fmin(f64), 10.0, -tmin(f64), -nan(f64), -inf(f64), 1.0, nan(f64), -fmin(f64), -1.0, nan(f64), -1.0, 0.0, 1.0, nan(f64), -1.0, -fmin(f64),
3971 });
3972 try testArgs(@Vector(64, f64), .{
3973 -10.0, fmax(f64), -nan(f64), tmin(f64), 0.1, -1.0, 1.0, -0.0, -fmin(f64), 0.1, -fmin(f64), -0.0, -0.0, tmin(f64), -10.0, 0.1,
3974 -10.0, -fmax(f64), -10.0, -fmin(f64), 0.0, -10.0, nan(f64), 1.0, inf(f64), inf(f64), -inf(f64), tmin(f64), tmin(f64), 0.1, -0.0, 0.1,
3975 -0.0, 0.1, -10.0, 10.0, fmax(f64), -fmin(f64), 1.0, fmax(f64), 1.0, -10.0, fmin(f64), fmax(f64), -1.0, -0.0, -0.0, fmax(f64),
3976 -inf(f64), -inf(f64), -tmin(f64), -fmax(f64), -nan(f64), tmin(f64), -1.0, 0.0, -inf(f64), fmax(f64), nan(f64), -inf(f64), fmin(f64), -nan(f64), -nan(f64), -10.0,
3977 }, .{
3978 nan(f64), -1.0, 0.0, -10.0, -fmax(f64), -fmin(f64), -nan(f64), -tmin(f64), 0.1, -1.0, -nan(f64), -fmax(f64), 0.0, 0.0, 10.0, inf(f64),
3979 fmin(f64), 0.0, -10.0, 1.0, -tmin(f64), -inf(f64), -fmax(f64), 0.0, -fmin(f64), -1.0, -fmin(f64), tmin(f64), 1.0, -10.0, fmin(f64), 0.1,
3980 inf(f64), -0.0, tmin(f64), -fmax(f64), -tmin(f64), -fmax(f64), fmin(f64), -fmax(f64), 0.1, 1.0, 1.0, 0.0, fmin(f64), nan(f64), -10.0, tmin(f64),
3981 inf(f64), 0.1, 1.0, -nan(f64), 1.0, -fmin(f64), fmax(f64), inf(f64), fmin(f64), -inf(f64), -0.0, 0.0, -1.0, -0.0, 0.1, 0.1,
3982 });
3983 try testArgs(@Vector(128, f64), .{
3984 nan(f64), -fmin(f64), fmax(f64), fmin(f64), -10.0, nan(f64), tmin(f64), fmax(f64), inf(f64), -nan(f64), tmin(f64), -nan(f64), -0.0, fmin(f64), fmax(f64),
3985 -inf(f64), inf(f64), -1.0, 0.0, 0.1, fmin(f64), 0.0, 0.1, -1.0, -inf(f64), 0.1, fmax(f64), fmin(f64), fmax(f64), -fmax(f64),
3986 fmin(f64), inf(f64), -fmin(f64), -10.0, -0.0, 0.1, nan(f64), -fmax(f64), -fmax(f64), -1.0, 10.0, 10.0, -1.0, -inf(f64), inf(f64),
3987 -fmin(f64), 1.0, -inf(f64), -10.0, 0.1, 1.0, 10.0, 10.0, tmin(f64), nan(f64), inf(f64), 0.0, -1.0, -10.0, 1.0,
3988 -tmin(f64), -fmax(f64), -nan(f64), 10.0, 0.1, tmin(f64), 0.0, 10.0, 0.1, -tmin(f64), -tmin(f64), 1.0, -fmax(f64), nan(f64), -fmin(f64),
3989 nan(f64), 10.0, -1.0, -0.0, -tmin(f64), nan(f64), 10.0, 10.0, -inf(f64), 0.1, -nan(f64), -10.0, -tmin(f64), -fmax(f64), -fmax(f64),
3990 inf(f64), -inf(f64), tmin(f64), 1.0, -inf(f64), -10.0, inf(f64), 0.1, -nan(f64), -inf(f64), fmax(f64), 0.1, -inf(f64), 0.1, 1.0,
3991 0.1, 0.1, 0.1, inf(f64), -inf(f64), 1.0, 10.0, 10.0, nan(f64), 10.0, -tmin(f64), 1.0, -fmin(f64), -1.0, -fmax(f64),
3992 -fmin(f64), -fmin(f64), -1.0, inf(f64), nan(f64), tmin(f64), 0.1, -1.0,
3993 }, .{
3994 0.0, 0.0, inf(f64), -0.0, 0.1, -nan(f64), 10.0, -nan(f64), tmin(f64), -10.0, -0.0, inf(f64), -fmin(f64), 0.1, fmax(f64),
3995 nan(f64), -tmin(f64), tmin(f64), 1.0, 0.1, -10.0, -nan(f64), 1.0, inf(f64), -10.0, fmin(f64), 0.1, 10.0, -10.0, 10.0,
3996 -nan(f64), -nan(f64), 0.1, 0.0, 10.0, -fmax(f64), -tmin(f64), tmin(f64), -1.0, -tmin(f64), -10.0, 0.1, -fmax(f64), 10.0, nan(f64),
3997 fmax(f64), -1.0, -1.0, -tmin(f64), fmax(f64), -10.0, 0.1, 1.0, fmin(f64), inf(f64), 0.1, tmin(f64), 0.1, -fmax(f64), fmax(f64),
3998 -10.0, -fmax(f64), fmax(f64), tmin(f64), -fmin(f64), inf(f64), 0.1, -0.0, fmax(f64), tmin(f64), 0.1, 1.0, -inf(f64), 1.0, 10.0,
3999 0.1, 0.0, -10.0, -nan(f64), 10.0, -fmin(f64), -tmin(f64), 10.0, 1.0, -tmin(f64), -1.0, -fmin(f64), -0.0, -10.0, 0.1,
4000 inf(f64), -fmax(f64), 0.1, tmin(f64), -0.0, fmax(f64), 0.0, -nan(f64), -fmin(f64), fmax(f64), -0.0, nan(f64), -inf(f64), tmin(f64), 0.1,
4001 inf(f64), 0.0, 10.0, -fmax(f64), tmin(f64), -0.0, fmin(f64), -nan(f64), -10.0, -inf(f64), nan(f64), inf(f64), -0.0, 10.0, fmax(f64),
4002 tmin(f64), -10.0, -nan(f64), 10.0, -inf(f64), -fmax(f64), -inf(f64), -1.0,
4003 });
4004 try testArgs(@Vector(69, f64), .{
4005 inf(f64), -0.0, -fmax(f64), fmax(f64), fmax(f64), 0.0, fmin(f64), -nan(f64), 0.1, 0.1, 0.1, -fmin(f64), inf(f64), 0.1, fmax(f64), nan(f64),
4006 tmin(f64), -10.0, 10.0, -tmin(f64), -0.0, nan(f64), -10.0, fmin(f64), 0.0, -0.0, 0.1, inf(f64), -tmin(f64), -nan(f64), inf(f64), -nan(f64),
4007 -inf(f64), fmax(f64), 0.1, -fmin(f64), 0.1, -1.0, fmin(f64), fmin(f64), fmin(f64), 10.0, -fmin(f64), nan(f64), 0.0, 0.0, 10.0, nan(f64),
4008 -tmin(f64), tmin(f64), tmin(f64), fmin(f64), -0.0, -1.0, 0.1, 1.0, fmax(f64), tmin(f64), fmin(f64), 0.0, -fmin(f64), fmin(f64), -tmin(f64), 0.0,
4009 -nan(f64), 10.0, -1.0, 0.1, 0.0,
4010 }, .{
4011 -10.0, -0.0, fmin(f64), -fmin(f64), nan(f64), 10.0, -tmin(f64), -fmax(f64), 10.0, 0.1, -fmin(f64), inf(f64), -inf(f64), -tmin(f64), 1.0, tmin(f64),
4012 -tmin(f64), -nan(f64), fmax(f64), 0.0, -1.0, 10.0, inf(f64), fmin(f64), fmax(f64), 0.1, 0.1, fmax(f64), -inf(f64), 0.1, 0.1, fmin(f64),
4013 0.1, fmin(f64), -10.0, nan(f64), 0.0, 0.0, fmax(f64), -inf(f64), tmin(f64), inf(f64), -tmin(f64), fmax(f64), -inf(f64), -10.0, -1.0, fmin(f64),
4014 0.1, -nan(f64), fmax(f64), -fmin(f64), fmax(f64), nan(f64), -0.0, -fmax(f64), 10.0, nan(f64), inf(f64), -1.0, -fmin(f64), nan(f64), -fmin(f64), -0.0,
4015 -nan(f64), -fmin(f64), 0.1, nan(f64), 0.1,
4016 });
4017
4018 try testArgs(@Vector(1, f80), .{
4019 -nan(f80),
4020 }, .{
4021 -1.0,
4022 });
4023 try testArgs(@Vector(2, f80), .{
4024 -fmax(f80), -inf(f80),
4025 }, .{
4026 0.1, 10.0,
4027 });
4028 try testArgs(@Vector(4, f80), .{
4029 -0.0, -inf(f80), 0.1, 10.0,
4030 }, .{
4031 -1.0, 0.0, 0.1, -10.0,
4032 });
4033 try testArgs(@Vector(8, f80), .{
4034 1.0, -0.0, -inf(f80), 0.1, -inf(f80), fmin(f80), 0.0, 10.0,
4035 }, .{
4036 -0.0, -fmin(f80), fmin(f80), -nan(f80), nan(f80), inf(f80), fmin(f80), 10.0,
4037 });
4038 try testArgs(@Vector(16, f80), .{
4039 10.0, inf(f80), -fmin(f80), 0.1, -tmin(f80), -0.0, -inf(f80), -1.0, -fmax(f80), -nan(f80), -tmin(f80), 10.0, 10.0, -inf(f80), -fmax(f80), fmax(f80),
4040 }, .{
4041 -inf(f80), nan(f80), -fmax(f80), fmin(f80), 1.0, 0.1, -inf(f80), nan(f80), 0.1, nan(f80), -inf(f80), nan(f80), tmin(f80), 0.1, -tmin(f80), -10.0,
4042 });
4043 try testArgs(@Vector(32, f80), .{
4044 inf(f80), -0.0, 0.1, -0.0, 0.1, -fmin(f80), -0.0, fmax(f80), nan(f80), -tmin(f80), nan(f80), -10.0, 0.0, 1.0, 10.0, -fmin(f80),
4045 fmin(f80), 0.1, inf(f80), -0.0, nan(f80), tmin(f80), -tmin(f80), fmin(f80), tmin(f80), -0.0, nan(f80), -fmax(f80), tmin(f80), -fmin(f80), 1.0, tmin(f80),
4046 }, .{
4047 0.0, -10.0, fmax(f80), -inf(f80), 0.1, -inf(f80), inf(f80), 10.0, -1.0, -10.0, -fmin(f80), 0.0, inf(f80), 1.0, -nan(f80), 0.0,
4048 0.1, nan(f80), 1.0, -fmax(f80), fmin(f80), -inf(f80), -fmax(f80), 0.1, -10.0, tmin(f80), fmax(f80), -0.0, -fmin(f80), -fmin(f80), fmin(f80), -tmin(f80),
4049 });
4050 try testArgs(@Vector(64, f80), .{
4051 -fmax(f80), 0.1, -1.0, 1.0, inf(f80), 0.1, -10.0, 0.1, fmin(f80), -fmin(f80), -10.0, -fmax(f80), 0.0, -10.0, -1.0, -nan(f80),
4052 0.0, 0.1, -1.0, -tmin(f80), 1.0, tmin(f80), fmax(f80), 0.0, -10.0, -tmin(f80), fmax(f80), -0.0, 0.1, -inf(f80), -fmax(f80), -1.0,
4053 -nan(f80), tmin(f80), -tmin(f80), -0.0, -0.0, -1.0, -0.0, fmax(f80), inf(f80), -nan(f80), 0.1, -inf(f80), -tmin(f80), nan(f80), 0.1, 10.0,
4054 nan(f80), -inf(f80), 0.1, tmin(f80), -fmin(f80), 10.0, -10.0, tmin(f80), fmin(f80), nan(f80), 0.1, -nan(f80), tmin(f80), nan(f80), fmax(f80), -fmax(f80),
4055 }, .{
4056 -nan(f80), -fmax(f80), tmin(f80), -inf(f80), -tmin(f80), fmin(f80), -nan(f80), -fmin(f80), fmax(f80), inf(f80), -0.0, -1.0, 0.1, -fmax(f80), 1.0, -inf(f80),
4057 0.0, -nan(f80), -10.0, -1.0, -nan(f80), inf(f80), 1.0, -nan(f80), 10.0, inf(f80), tmin(f80), 0.1, tmin(f80), -tmin(f80), -inf(f80), -fmin(f80),
4058 fmax(f80), fmax(f80), 0.1, -tmin(f80), -nan(f80), -1.0, fmin(f80), -nan(f80), -nan(f80), inf(f80), -1.0, 0.1, -fmin(f80), -tmin(f80), 0.0, -0.0,
4059 0.1, -fmin(f80), -inf(f80), -1.0, -tmin(f80), 1.0, -inf(f80), -0.0, 0.0, 1.0, tmin(f80), 0.0, 0.1, -nan(f80), fmax(f80), 1.0,
4060 });
4061 try testArgs(@Vector(128, f80), .{
4062 0.1, -0.0, 0.1, 0.0, fmin(f80), -1.0, 1.0, -inf(f80), fmax(f80), -fmin(f80), nan(f80), 10.0, 0.1, 0.1, -fmin(f80), -inf(f80),
4063 -1.0, -inf(f80), 1.0, -fmin(f80), inf(f80), -nan(f80), 10.0, inf(f80), tmin(f80), nan(f80), -10.0, inf(f80), 10.0, inf(f80), -10.0, 0.0,
4064 -10.0, fmin(f80), -tmin(f80), 1.0, -fmax(f80), nan(f80), 0.0, fmax(f80), 0.1, -1.0, -fmin(f80), inf(f80), -tmin(f80), nan(f80), -tmin(f80), 10.0,
4065 -10.0, -tmin(f80), -1.0, -tmin(f80), -fmax(f80), 10.0, -1.0, -inf(f80), -nan(f80), 0.0, 1.0, fmax(f80), -tmin(f80), -fmin(f80), fmin(f80), fmin(f80),
4066 -10.0, -fmax(f80), -tmin(f80), inf(f80), 1.0, 0.0, tmin(f80), -nan(f80), -fmin(f80), 0.1, -nan(f80), 0.0, 0.1, -10.0, -0.0, -nan(f80),
4067 1.0, 10.0, -10.0, fmin(f80), -nan(f80), fmax(f80), -0.0, 1.0, inf(f80), 1.0, -fmin(f80), -fmin(f80), 0.0, 0.1, inf(f80), 10.0,
4068 tmin(f80), -1.0, fmax(f80), -0.0, fmax(f80), fmax(f80), 0.1, -fmin(f80), -10.0, 1.0, -fmin(f80), -fmax(f80), fmin(f80), -fmax(f80), -0.0, -1.0,
4069 -nan(f80), -inf(f80), nan(f80), -fmax(f80), inf(f80), -inf(f80), -nan(f80), fmin(f80), nan(f80), -1.0, tmin(f80), tmin(f80), 0.1, 10.0, -tmin(f80), -nan(f80),
4070 }, .{
4071 -1.0, -0.0, 0.0, fmax(f80), -1.0, -0.0, 0.1, tmin(f80), -inf(f80), 10.0, -0.0, 0.1, -tmin(f80), -fmax(f80), tmin(f80), inf(f80),
4072 0.1, 1.0, tmin(f80), nan(f80), -fmax(f80), 10.0, fmin(f80), -1.0, -fmax(f80), nan(f80), -fmin(f80), 10.0, -1.0, tmin(f80), inf(f80), -0.0,
4073 tmin(f80), 1.0, 0.0, -fmin(f80), 0.0, 10.0, -fmax(f80), -0.0, -inf(f80), fmin(f80), -0.0, -0.0, -0.0, -fmax(f80), 0.1, fmax(f80),
4074 -tmin(f80), tmin(f80), -fmax(f80), 10.0, -fmax(f80), 0.1, fmax(f80), -10.0, 0.1, 1.0, -1.0, -1.0, nan(f80), -nan(f80), 10.0, -nan(f80),
4075 nan(f80), -10.0, -tmin(f80), fmin(f80), -tmin(f80), -fmin(f80), tmin(f80), -0.0, 0.1, fmax(f80), tmin(f80), tmin(f80), nan(f80), 0.1, 10.0, 0.1,
4076 inf(f80), inf(f80), 1.0, -inf(f80), -fmax(f80), 0.0, 1.0, -fmax(f80), fmax(f80), nan(f80), fmin(f80), 0.1, -1.0, 1.0, 0.1, -tmin(f80),
4077 10.0, 0.1, -fmax(f80), 0.0, nan(f80), -tmin(f80), 0.1, fmax(f80), fmax(f80), 0.1, -1.0, inf(f80), nan(f80), 10.0, fmax(f80), -nan(f80),
4078 -10.0, -1.0, tmin(f80), fmin(f80), inf(f80), fmax(f80), -fmin(f80), fmin(f80), -inf(f80), -tmin(f80), 1.0, nan(f80), -fmin(f80), -fmin(f80), fmax(f80), 1.0,
4079 });
4080 try testArgs(@Vector(69, f80), .{
4081 -10.0, tmin(f80), 0.1, -nan(f80), -inf(f80), -nan(f80), fmin(f80), -0.0, 10.0, fmax(f80), -fmin(f80), 0.1, -nan(f80), inf(f80), 1.0, -1.0,
4082 inf(f80), fmin(f80), -fmax(f80), 0.1, nan(f80), 0.0, 0.0, nan(f80), -10.0, fmax(f80), fmin(f80), -fmax(f80), 1.0, 0.1, 0.0, -fmin(f80),
4083 -tmin(f80), 0.0, -10.0, fmin(f80), 1.0, 10.0, 0.1, nan(f80), -10.0, fmax(f80), 0.1, fmin(f80), -inf(f80), 0.0, tmin(f80), inf(f80),
4084 fmax(f80), 1.0, 0.1, nan(f80), inf(f80), tmin(f80), tmin(f80), -fmax(f80), 0.0, fmin(f80), -inf(f80), 0.1, -tmin(f80), 0.1, -1.0, 0.1,
4085 -fmax(f80), -1.0, 0.1, -1.0, fmax(f80),
4086 }, .{
4087 -1.0, fmin(f80), inf(f80), -nan(f80), -0.0, fmin(f80), -0.0, nan(f80), -fmax(f80), 0.1, 1.0, -10.0, -tmin(f80), -fmin(f80), 10.0, inf(f80),
4088 -10.0, -tmin(f80), -fmin(f80), 10.0, 0.0, -tmin(f80), 10.0, -10.0, 0.1, 0.1, tmin(f80), fmax(f80), 0.0, 0.1, 0.1, -10.0,
4089 fmin(f80), nan(f80), -10.0, -10.0, -10.0, 0.0, -0.0, 0.1, fmin(f80), fmin(f80), -0.0, -fmin(f80), -nan(f80), -inf(f80), 0.0, -inf(f80),
4090 inf(f80), fmax(f80), -tmin(f80), inf(f80), 0.1, -nan(f80), 0.1, tmin(f80), -10.0, -fmax(f80), -fmax(f80), inf(f80), -nan(f80), 1.0, -inf(f80), 10.0,
4091 nan(f80), 10.0, -10.0, 0.0, -fmin(f80),
4092 });
4093
4094 try testArgs(@Vector(1, f128), .{
4095 -nan(f128),
4096 }, .{
4097 -0.0,
4098 });
4099 try testArgs(@Vector(2, f128), .{
4100 0.0, -inf(f128),
4101 }, .{
4102 0.1, -fmin(f128),
4103 });
4104 try testArgs(@Vector(4, f128), .{
4105 0.1, fmax(f128), 10.0, -fmax(f128),
4106 }, .{
4107 -tmin(f128), fmax(f128), -0.0, -0.0,
4108 });
4109 try testArgs(@Vector(8, f128), .{
4110 10.0, -fmin(f128), 0.0, -inf(f128), 10.0, -0.0, -1.0, -fmin(f128),
4111 }, .{
4112 fmin(f128), tmin(f128), -1.0, -10.0, 0.0, -tmin(f128), 0.0, 0.1,
4113 });
4114 try testArgs(@Vector(16, f128), .{
4115 -fmin(f128), -10.0, -fmin(f128), 0.1, -10.0, 1.0, -fmax(f128), tmin(f128), -nan(f128), -tmin(f128), 10.0, -inf(f128), -1.0, tmin(f128), -0.0, nan(f128),
4116 }, .{
4117 -fmax(f128), fmin(f128), inf(f128), tmin(f128), -10.0, 10.0, fmax(f128), 1.0, -inf(f128), -inf(f128), -fmax(f128), -nan(f128), 1.0, -inf(f128), tmin(f128), tmin(f128),
4118 });
4119 try testArgs(@Vector(32, f128), .{
4120 -0.0, -1.0, 1.0, -fmax(f128), -fmax(f128), 0.1, -fmin(f128), -fmin(f128), -1.0, -tmin(f128), -0.0, -fmax(f128), tmin(f128), inf(f128), 0.0, fmax(f128),
4121 -nan(f128), -0.0, -inf(f128), -1.0, 0.1, -fmin(f128), tmin(f128), -10.0, fmax(f128), -nan(f128), -nan(f128), -fmax(f128), 0.1, inf(f128), -0.0, tmin(f128),
4122 }, .{
4123 -1.0, -10.0, -fmin(f128), -fmin(f128), inf(f128), tmin(f128), nan(f128), 0.0, -fmin(f128), 0.1, -nan(f128), 0.1, -0.0, tmin(f128), 1.0, 0.0,
4124 fmin(f128), fmax(f128), -fmax(f128), -tmin(f128), fmin(f128), -0.0, -1.0, -nan(f128), -inf(f128), 1.0, nan(f128), 1.0, 0.1, -0.0, -fmax(f128), -10.0,
4125 });
4126 try testArgs(@Vector(64, f128), .{
4127 -1.0, -0.0, nan(f128), 0.1, -10.0, 0.0, 1.0, 1.0, -inf(f128), fmin(f128), fmax(f128), nan(f128), -nan(f128), inf(f128), -0.0,
4128 0.1, -inf(f128), -fmax(f128), 10.0, -tmin(f128), -tmin(f128), -fmax(f128), 1.0, 0.1, 0.1, nan(f128), 10.0, 1.0, -tmin(f128), 10.0,
4129 -nan(f128), fmax(f128), fmax(f128), 0.0, fmax(f128), inf(f128), 1.0, -0.0, 0.1, -tmin(f128), fmin(f128), fmax(f128), tmin(f128), inf(f128), -10.0,
4130 -1.0, -1.0, -1.0, -inf(f128), 10.0, -tmin(f128), nan(f128), nan(f128), 0.1, fmin(f128), 0.1, tmin(f128), -10.0, 0.1, 10.0,
4131 fmax(f128), fmax(f128), 0.1, -fmax(f128),
4132 }, .{
4133 -0.0, 0.1, -0.0, -fmin(f128), 10.0, 0.0, 1.0, -inf(f128), tmin(f128), -1.0, fmin(f128), -nan(f128), -10.0, 0.1, -10.0, 0.1,
4134 0.1, tmin(f128), nan(f128), -1.0, 0.0, -10.0, -10.0, fmax(f128), -fmax(f128), inf(f128), -nan(f128), 0.1, -nan(f128), 1.0, fmax(f128), inf(f128),
4135 nan(f128), fmin(f128), 10.0, inf(f128), 0.0, -inf(f128), 0.1, 0.1, 0.1, -1.0, 0.1, -10.0, inf(f128), -nan(f128), 0.1, inf(f128),
4136 inf(f128), inf(f128), -10.0, -tmin(f128), 0.1, -inf(f128), -fmin(f128), 1.0, -tmin(f128), 1.0, -tmin(f128), -inf(f128), -0.0, -nan(f128), -1.0, -fmax(f128),
4137 });
4138 try testArgs(@Vector(128, f128), .{
4139 -inf(f128), tmin(f128), -fmax(f128), 1.0, fmin(f128), -fmax(f128), -1.0, 0.1, -fmax(f128), -fmin(f128), -10.0, nan(f128), 0.1, nan(f128),
4140 inf(f128), -1.0, tmin(f128), -inf(f128), 0.0, fmax(f128), tmin(f128), -fmin(f128), fmin(f128), -10.0, -fmin(f128), -10.0, 1.0, -nan(f128),
4141 -inf(f128), fmin(f128), inf(f128), -tmin(f128), 0.1, 0.0, 10.0, 1.0, -tmin(f128), -tmin(f128), tmin(f128), 1.0, fmin(f128), 0.1,
4142 0.1, 0.1, fmax(f128), 0.1, inf(f128), 0.0, fmin(f128), -fmin(f128), 10.0, 10.0, -10.0, tmin(f128), inf(f128), inf(f128),
4143 -fmin(f128), 0.0, 0.1, -nan(f128), 0.1, -inf(f128), -nan(f128), -1.0, fmin(f128), -0.0, 10.0, -tmin(f128), 10.0, 1.0,
4144 0.1, -0.0, -tmin(f128), 0.1, -1.0, -tmin(f128), -fmin(f128), tmin(f128), 0.1, -tmin(f128), -nan(f128), -10.0, -inf(f128), 0.0,
4145 0.1, 0.0, -fmin(f128), 0.0, 10.0, 10.0, tmin(f128), inf(f128), -nan(f128), -inf(f128), -1.0, -fmin(f128), -10.0, -fmin(f128),
4146 -inf(f128), -fmax(f128), tmin(f128), tmin(f128), -fmin(f128), 0.1, fmin(f128), fmin(f128), -fmin(f128), nan(f128), -1.0, -0.0, -0.0, 0.1,
4147 fmax(f128), 0.0, -fmax(f128), nan(f128), nan(f128), nan(f128), nan(f128), -nan(f128), fmin(f128), -inf(f128), inf(f128), -fmax(f128), -10.0, fmin(f128),
4148 0.1, fmax(f128),
4149 }, .{
4150 0.0, 10.0, 0.1, inf(f128), -0.0, -1.0, nan(f128), -10.0, -inf(f128), 0.1, -tmin(f128), 1.0, inf(f128), 0.1, -1.0,
4151 10.0, 0.0, 1.0, nan(f128), tmin(f128), fmax(f128), 10.0, 0.1, 0.1, -fmin(f128), -inf(f128), -nan(f128), -fmin(f128), -0.0, -inf(f128),
4152 -nan(f128), fmax(f128), -fmin(f128), -tmin(f128), -fmin(f128), -fmax(f128), nan(f128), fmin(f128), -fmax(f128), fmax(f128), 1.0, 10.0, -fmax(f128), nan(f128), -fmax(f128),
4153 -inf(f128), nan(f128), -nan(f128), tmin(f128), -1.0, 0.1, 0.1, -1.0, -nan(f128), fmax(f128), 10.0, -inf(f128), 10.0, -0.0, -1.0,
4154 -0.0, -tmin(f128), 10.0, -1.0, -fmax(f128), fmin(f128), fmax(f128), tmin(f128), 10.0, fmin(f128), -nan(f128), 1.0, -tmin(f128), -1.0, fmax(f128),
4155 1.0, -tmin(f128), 0.1, -nan(f128), inf(f128), 0.1, 0.1, fmax(f128), -fmin(f128), fmin(f128), -0.0, fmax(f128), -fmax(f128), -tmin(f128), tmin(f128),
4156 nan(f128), 0.1, tmin(f128), -1.0, fmin(f128), -nan(f128), fmax(f128), 1.0, nan(f128), -nan(f128), inf(f128), -fmin(f128), fmin(f128), 0.1, 10.0,
4157 -tmin(f128), -10.0, 0.0, 0.1, -fmin(f128), -0.0, 0.0, -10.0, fmax(f128), nan(f128), nan(f128), -fmin(f128), -fmax(f128), 10.0, 0.0,
4158 fmin(f128), 10.0, -tmin(f128), -tmin(f128), 0.0, -10.0, 1.0, -fmin(f128),
4159 });
4160 try testArgs(@Vector(69, f128), .{
4161 -1.0, nan(f128), 0.1, 0.1, 0.1, -1.0, -10.0, inf(f128), -0.0, inf(f128), tmin(f128), 0.0, -fmax(f128), -tmin(f128), -10.0, -fmax(f128),
4162 -0.0, 0.0, nan(f128), inf(f128), 1.0, -1.0, 0.1, -0.0, 1.0, fmax(f128), -fmax(f128), 0.0, inf(f128), -inf(f128), -tmin(f128), -inf(f128),
4163 10.0, fmin(f128), 10.0, -10.0, 0.1, 1.0, -0.0, nan(f128), tmin(f128), inf(f128), inf(f128), -nan(f128), -nan(f128), 1.0, -tmin(f128), 0.0,
4164 fmin(f128), fmax(f128), fmin(f128), -10.0, nan(f128), 0.0, -nan(f128), -0.0, -nan(f128), 0.1, -10.0, -tmin(f128), fmax(f128), 1.0, fmin(f128), fmax(f128),
4165 nan(f128), -inf(f128), 1.0, fmin(f128), -nan(f128),
4166 }, .{
4167 -inf(f128), fmax(f128), 0.0, nan(f128), -10.0, tmin(f128), nan(f128), 1.0, 10.0, -fmin(f128), fmin(f128), tmin(f128), 0.0, -fmin(f128), -0.0, fmin(f128),
4168 inf(f128), inf(f128), fmin(f128), fmin(f128), -tmin(f128), -fmax(f128), 10.0, nan(f128), -0.0, 1.0, 10.0, -10.0, -inf(f128), fmin(f128), -fmax(f128), 0.1,
4169 -1.0, -nan(f128), -10.0, tmin(f128), inf(f128), nan(f128), 0.0, -10.0, tmin(f128), 0.0, -fmax(f128), -tmin(f128), 0.1, 0.1, 10.0, 0.1,
4170 fmax(f128), 0.1, 0.0, -fmin(f128), -inf(f128), -inf(f128), -nan(f128), 0.1, -fmax(f128), fmax(f128), -fmax(f128), -0.0, -tmin(f128), -1.0, nan(f128), 0.1,
4171 -1.0, -inf(f128), tmin(f128), inf(f128), inf(f128),
4172 });
4173 }
37844174 };
37854175}
37864176
......@@ -3848,6 +4238,7 @@ test min {
38484238 try t.testIntTypes();
38494239 try t.testIntVectorTypes();
38504240 try t.testFloatTypes();
4241 try t.testFloatVectorTypes();
38514242}
38524243
38534244inline fn max(comptime Type: type, lhs: Type, rhs: Type) Type {
......@@ -3858,4 +4249,5 @@ test max {
38584249 try t.testIntTypes();
38594250 try t.testIntVectorTypes();
38604251 try t.testFloatTypes();
4252 try t.testFloatVectorTypes();
38614253}