authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-05 01:10:52-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-01-16 20:47:30-05:00
log3240adfa16cd09d6664223975776c80990cb55cc
treeea332760f355fcba5f84870c7ebf885d04da3b2d
parent0d9079f46654e39763bbd66090c85cdc466cc18c

x86_64: implement pointer addition and subtraction


2 files changed, 412 insertions(+), 60 deletions(-)

src/arch/x86_64/CodeGen.zig+404-58
...@@ -2404,8 +2404,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2404,8 +2404,6 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2404 .max,2404 .max,
2405 => |air_tag| try cg.airBinOp(inst, air_tag),2405 => |air_tag| try cg.airBinOp(inst, air_tag),
24062406
2407 .ptr_add, .ptr_sub => |air_tag| try cg.airPtrArithmetic(inst, air_tag),
2408
2409 .shr, .shr_exact => try cg.airShlShrBinOp(inst),2407 .shr, .shr_exact => try cg.airShlShrBinOp(inst),
2410 .shl, .shl_exact => try cg.airShlShrBinOp(inst),2408 .shl, .shl_exact => try cg.airShlShrBinOp(inst),
24112409
...@@ -2524,14 +2522,262 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2524,14 +2522,262 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2524 => return cg.fail("TODO implement optimized float mode", .{}),2522 => return cg.fail("TODO implement optimized float mode", .{}),
25252523
2526 .arg => try cg.airDbgArg(inst),2524 .arg => try cg.airDbgArg(inst),
2525 .ptr_add => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {
2526 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
2527 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
2528 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
2529 try ops[0].toSlicePtr(cg);
2530 var res: [1]Temp = undefined;
2531 cg.select(&res, &.{cg.typeOfIndex(inst)}, &ops, comptime &.{ .{
2532 .patterns = &.{
2533 .{ .src = .{ .to_gpr, .simm32 } },
2534 },
2535 .dst_temps = .{.{ .rc = .general_purpose }},
2536 .each = .{ .once = &.{
2537 .{ ._, ._, .lea, .dst0p, .leaa(.none, .src0, .add_src0_elem_size_times_src1), ._, ._ },
2538 } },
2539 }, .{
2540 .dst_constraints = .{.{ .elem_size_is = 1 }},
2541 .patterns = &.{
2542 .{ .src = .{ .to_gpr, .to_gpr } },
2543 },
2544 .dst_temps = .{.{ .rc = .general_purpose }},
2545 .each = .{ .once = &.{
2546 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2547 } },
2548 }, .{
2549 .dst_constraints = .{.{ .elem_size_is = 2 }},
2550 .patterns = &.{
2551 .{ .src = .{ .to_gpr, .to_gpr } },
2552 },
2553 .dst_temps = .{.{ .rc = .general_purpose }},
2554 .each = .{ .once = &.{
2555 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"2", .src1), ._, ._ },
2556 } },
2557 }, .{
2558 .dst_constraints = .{.{ .elem_size_is = 2 + 1 }},
2559 .patterns = &.{
2560 .{ .src = .{ .to_gpr, .to_gpr } },
2561 },
2562 .dst_temps = .{.{ .rc = .general_purpose }},
2563 .each = .{ .once = &.{
2564 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"2", .src1), ._, ._ },
2565 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2566 } },
2567 }, .{
2568 .dst_constraints = .{.{ .elem_size_is = 4 }},
2569 .patterns = &.{
2570 .{ .src = .{ .to_gpr, .to_gpr } },
2571 },
2572 .dst_temps = .{.{ .rc = .general_purpose }},
2573 .each = .{ .once = &.{
2574 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"4", .src1), ._, ._ },
2575 } },
2576 }, .{
2577 .dst_constraints = .{.{ .elem_size_is = 4 + 1 }},
2578 .patterns = &.{
2579 .{ .src = .{ .to_gpr, .to_gpr } },
2580 },
2581 .dst_temps = .{.{ .ref = .src1 }},
2582 .each = .{ .once = &.{
2583 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"4", .src1), ._, ._ },
2584 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2585 } },
2586 }, .{
2587 .required_features = .{ .@"64bit", null, null, null },
2588 .dst_constraints = .{.{ .elem_size_is = 8 }},
2589 .patterns = &.{
2590 .{ .src = .{ .to_gpr, .to_gpr } },
2591 },
2592 .dst_temps = .{.{ .rc = .general_purpose }},
2593 .each = .{ .once = &.{
2594 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"8", .src1), ._, ._ },
2595 } },
2596 }, .{
2597 .required_features = .{ .@"64bit", null, null, null },
2598 .dst_constraints = .{.{ .elem_size_is = 8 + 1 }},
2599 .patterns = &.{
2600 .{ .src = .{ .to_gpr, .to_gpr } },
2601 },
2602 .dst_temps = .{.{ .ref = .src1 }},
2603 .each = .{ .once = &.{
2604 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"8", .src1), ._, ._ },
2605 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2606 } },
2607 }, .{
2608 .dst_constraints = .{.po2_elem_size},
2609 .patterns = &.{
2610 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2611 },
2612 .dst_temps = .{.{ .ref = .src1 }},
2613 .clobbers = .{ .eflags = true },
2614 .each = .{ .once = &.{
2615 .{ ._, ._l, .sh, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ },
2616 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2617 } },
2618 }, .{
2619 .patterns = &.{
2620 .{ .src = .{ .to_gpr, .to_gpr } },
2621 },
2622 .dst_temps = .{.{ .rc = .general_purpose }},
2623 .clobbers = .{ .eflags = true },
2624 .each = .{ .once = &.{
2625 .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .add_src0_elem_size), ._ },
2626 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2627 } },
2628 } }) catch |err| switch (err) {
2629 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
2630 @tagName(air_tag),
2631 cg.typeOf(bin_op.lhs).fmt(pt),
2632 ops[0].tracking(cg),
2633 ops[1].tracking(cg),
2634 }),
2635 else => |e| return e,
2636 };
2637 for (ops) |op| for (res) |r| {
2638 if (op.index == r.index) break;
2639 } else try op.die(cg);
2640 try res[0].moveTo(inst, cg);
2641 },
2642 .ptr_sub => |air_tag| if (use_old) try cg.airPtrArithmetic(inst, air_tag) else {
2643 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
2644 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
2645 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
2646 try ops[0].toSlicePtr(cg);
2647 var res: [1]Temp = undefined;
2648 cg.select(&res, &.{cg.typeOfIndex(inst)}, &ops, comptime &.{ .{
2649 .patterns = &.{
2650 .{ .src = .{ .to_gpr, .simm32 } },
2651 },
2652 .dst_temps = .{.{ .rc = .general_purpose }},
2653 .each = .{ .once = &.{
2654 .{ ._, ._, .lea, .dst0p, .leaa(.none, .src0, .sub_src0_elem_size_times_src1), ._, ._ },
2655 } },
2656 }, .{
2657 .dst_constraints = .{.{ .elem_size_is = 1 }},
2658 .patterns = &.{
2659 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2660 },
2661 .dst_temps = .{.{ .ref = .src1 }},
2662 .clobbers = .{ .eflags = true },
2663 .each = .{ .once = &.{
2664 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2665 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2666 } },
2667 }, .{
2668 .dst_constraints = .{.{ .elem_size_is = 2 }},
2669 .patterns = &.{
2670 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2671 },
2672 .dst_temps = .{.{ .ref = .src1 }},
2673 .clobbers = .{ .eflags = true },
2674 .each = .{ .once = &.{
2675 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2676 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"2", .src1), ._, ._ },
2677 } },
2678 }, .{
2679 .dst_constraints = .{.{ .elem_size_is = 2 + 1 }},
2680 .patterns = &.{
2681 .{ .src = .{ .to_gpr, .to_gpr } },
2682 },
2683 .dst_temps = .{.{ .rc = .general_purpose }},
2684 .clobbers = .{ .eflags = true },
2685 .each = .{ .once = &.{
2686 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"2", .src1), ._, ._ },
2687 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2688 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2689 } },
2690 }, .{
2691 .dst_constraints = .{.{ .elem_size_is = 4 }},
2692 .patterns = &.{
2693 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2694 },
2695 .dst_temps = .{.{ .ref = .src1 }},
2696 .clobbers = .{ .eflags = true },
2697 .each = .{ .once = &.{
2698 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2699 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"4", .src1), ._, ._ },
2700 } },
2701 }, .{
2702 .dst_constraints = .{.{ .elem_size_is = 4 + 1 }},
2703 .patterns = &.{
2704 .{ .src = .{ .to_gpr, .to_gpr } },
2705 },
2706 .dst_temps = .{.{ .rc = .general_purpose }},
2707 .clobbers = .{ .eflags = true },
2708 .each = .{ .once = &.{
2709 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"4", .src1), ._, ._ },
2710 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2711 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2712 } },
2713 }, .{
2714 .required_features = .{ .@"64bit", null, null, null },
2715 .dst_constraints = .{.{ .elem_size_is = 8 }},
2716 .patterns = &.{
2717 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2718 },
2719 .dst_temps = .{.{ .ref = .src1 }},
2720 .clobbers = .{ .eflags = true },
2721 .each = .{ .once = &.{
2722 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2723 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src0, .@"8", .src1), ._, ._ },
2724 } },
2725 }, .{
2726 .required_features = .{ .@"64bit", null, null, null },
2727 .dst_constraints = .{.{ .elem_size_is = 8 + 1 }},
2728 .patterns = &.{
2729 .{ .src = .{ .to_gpr, .to_gpr } },
2730 },
2731 .dst_temps = .{.{ .rc = .general_purpose }},
2732 .clobbers = .{ .eflags = true },
2733 .each = .{ .once = &.{
2734 .{ ._, ._, .lea, .dst0p, .leasi(.none, .src1, .@"8", .src1), ._, ._ },
2735 .{ ._, ._, .neg, .dst0p, ._, ._, ._ },
2736 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2737 } },
2738 }, .{
2739 .dst_constraints = .{.po2_elem_size},
2740 .patterns = &.{
2741 .{ .src = .{ .to_gpr, .to_mut_gpr } },
2742 },
2743 .dst_temps = .{.{ .ref = .src1 }},
2744 .clobbers = .{ .eflags = true },
2745 .each = .{ .once = &.{
2746 .{ ._, ._l, .sa, .src1p, .sa(.none, .add_log2_src0_elem_size), ._, ._ },
2747 .{ ._, ._, .neg, .src1p, ._, ._, ._ },
2748 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .src1), ._, ._ },
2749 } },
2750 }, .{
2751 .patterns = &.{
2752 .{ .src = .{ .to_gpr, .to_gpr } },
2753 },
2754 .dst_temps = .{.{ .rc = .general_purpose }},
2755 .clobbers = .{ .eflags = true },
2756 .each = .{ .once = &.{
2757 .{ ._, .i_, .mul, .dst0p, .src1p, .sa(.none, .sub_src0_elem_size), ._ },
2758 .{ ._, ._, .lea, .dst0p, .leai(.none, .src0, .dst0), ._, ._ },
2759 } },
2760 } }) catch |err| switch (err) {
2761 error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{
2762 @tagName(air_tag),
2763 cg.typeOf(bin_op.lhs).fmt(pt),
2764 ops[0].tracking(cg),
2765 ops[1].tracking(cg),
2766 }),
2767 else => |e| return e,
2768 };
2769 for (ops) |op| for (res) |r| {
2770 if (op.index == r.index) break;
2771 } else try op.die(cg);
2772 try res[0].moveTo(inst, cg);
2773 },
2527 .alloc => if (use_old) try cg.airAlloc(inst) else {2774 .alloc => if (use_old) try cg.airAlloc(inst) else {
2528 var slot = try cg.tempFromValue(cg.typeOfIndex(inst), .{ .lea_frame = .{2775 var slot = try cg.tempFromValue(cg.typeOfIndex(inst), .{ .lea_frame = .{
2529 .index = try cg.allocMemPtr(inst),2776 .index = try cg.allocMemPtr(inst),
2530 } });2777 } });
2531 try slot.moveTo(inst, cg);2778 try slot.moveTo(inst, cg);
2532 },2779 },
2533 .inferred_alloc => unreachable,2780 .inferred_alloc, .inferred_alloc_comptime => unreachable,
2534 .inferred_alloc_comptime => unreachable,
2535 .ret_ptr => if (use_old) try cg.airRetPtr(inst) else {2781 .ret_ptr => if (use_old) try cg.airRetPtr(inst) else {
2536 var slot = switch (cg.ret_mcv.long) {2782 var slot = switch (cg.ret_mcv.long) {
2537 else => unreachable,2783 else => unreachable,
...@@ -2901,8 +3147,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -2901,8 +3147,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
2901 }),3147 }),
2902 else => |e| return e,3148 else => |e| return e,
2903 };3149 };
2904 if (ops[0].index != res[0].index) try ops[0].die(cg);3150 for (ops) |op| for (res) |r| {
2905 if (ops[1].index != res[0].index) try ops[1].die(cg);3151 if (op.index == r.index) break;
3152 } else try op.die(cg);
2906 try res[0].moveTo(inst, cg);3153 try res[0].moveTo(inst, cg);
2907 },3154 },
2908 .not => |air_tag| if (use_old) try cg.airUnOp(inst, air_tag) else {3155 .not => |air_tag| if (use_old) try cg.airUnOp(inst, air_tag) else {
...@@ -3953,7 +4200,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -3953,7 +4200,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
3953 }),4200 }),
3954 else => |e| return e,4201 else => |e| return e,
3955 };4202 };
3956 if (ops[0].index != res[0].index) try ops[0].die(cg);4203 for (ops) |op| for (res) |r| {
4204 if (op.index == r.index) break;
4205 } else try op.die(cg);
3957 try res[0].moveTo(inst, cg);4206 try res[0].moveTo(inst, cg);
3958 },4207 },
39594208
...@@ -5016,6 +5265,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5016,6 +5265,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5016 .unused,5265 .unused,
5017 },5266 },
5018 .dst_temps = .{.{ .rc = .general_purpose }},5267 .dst_temps = .{.{ .rc = .general_purpose }},
5268 .clobbers = .{ .eflags = true },
5019 .each = .{ .once = &.{5269 .each = .{ .once = &.{
5020 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5270 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
5021 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5271 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
...@@ -5042,6 +5292,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5042,6 +5292,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5042 .unused,5292 .unused,
5043 },5293 },
5044 .dst_temps = .{.{ .rc = .general_purpose }},5294 .dst_temps = .{.{ .rc = .general_purpose }},
5295 .clobbers = .{ .eflags = true },
5045 .each = .{ .once = &.{5296 .each = .{ .once = &.{
5046 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5297 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
5047 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5298 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
...@@ -5067,6 +5318,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5067,6 +5318,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5067 .unused,5318 .unused,
5068 },5319 },
5069 .dst_temps = .{.{ .rc = .general_purpose }},5320 .dst_temps = .{.{ .rc = .general_purpose }},
5321 .clobbers = .{ .eflags = true },
5070 .each = .{ .once = &.{5322 .each = .{ .once = &.{
5071 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5323 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
5072 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5324 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
...@@ -5094,6 +5346,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5094,6 +5346,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5094 .unused,5346 .unused,
5095 },5347 },
5096 .dst_temps = .{.{ .rc = .general_purpose }},5348 .dst_temps = .{.{ .rc = .general_purpose }},
5349 .clobbers = .{ .eflags = true },
5097 .each = .{ .once = &.{5350 .each = .{ .once = &.{
5098 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5351 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
5099 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },5352 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },
...@@ -5120,6 +5373,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5120,6 +5373,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5120 .unused,5373 .unused,
5121 },5374 },
5122 .dst_temps = .{.{ .rc = .general_purpose }},5375 .dst_temps = .{.{ .rc = .general_purpose }},
5376 .clobbers = .{ .eflags = true },
5123 .each = .{ .once = &.{5377 .each = .{ .once = &.{
5124 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5378 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
5125 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5379 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
...@@ -5146,6 +5400,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5146,6 +5400,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5146 .unused,5400 .unused,
5147 },5401 },
5148 .dst_temps = .{.{ .rc = .general_purpose }},5402 .dst_temps = .{.{ .rc = .general_purpose }},
5403 .clobbers = .{ .eflags = true },
5149 .each = .{ .once = &.{5404 .each = .{ .once = &.{
5150 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5405 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
5151 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },5406 .{ .@"0:", ._, .lzcnt, .dst0q, .memi(.src0q, .tmp0), ._, ._ },
...@@ -5171,6 +5426,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5171,6 +5426,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5171 .unused,5426 .unused,
5172 },5427 },
5173 .dst_temps = .{.{ .rc = .general_purpose }},5428 .dst_temps = .{.{ .rc = .general_purpose }},
5429 .clobbers = .{ .eflags = true },
5174 .each = .{ .once = &.{5430 .each = .{ .once = &.{
5175 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5431 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
5176 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },5432 .{ .@"0:", ._, .xor, .dst0d, .dst0d, ._, ._ },
...@@ -5198,6 +5454,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5198,6 +5454,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5198 .unused,5454 .unused,
5199 },5455 },
5200 .dst_temps = .{.{ .rc = .general_purpose }},5456 .dst_temps = .{.{ .rc = .general_purpose }},
5457 .clobbers = .{ .eflags = true },
5201 .each = .{ .once = &.{5458 .each = .{ .once = &.{
5202 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5459 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
5203 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },5460 .{ .@"0:", ._, .mov, .dst0d, .si(-1), ._, ._ },
...@@ -5224,6 +5481,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5224,6 +5481,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5224 .unused,5481 .unused,
5225 },5482 },
5226 .dst_temps = .{.{ .rc = .general_purpose }},5483 .dst_temps = .{.{ .rc = .general_purpose }},
5484 .clobbers = .{ .eflags = true },
5227 .each = .{ .once = &.{5485 .each = .{ .once = &.{
5228 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5486 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
5229 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },5487 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5253,6 +5511,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5253,6 +5511,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5253 .unused,5511 .unused,
5254 },5512 },
5255 .dst_temps = .{.{ .rc = .general_purpose }},5513 .dst_temps = .{.{ .rc = .general_purpose }},
5514 .clobbers = .{ .eflags = true },
5256 .each = .{ .once = &.{5515 .each = .{ .once = &.{
5257 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5516 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
5258 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },5517 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5281,6 +5540,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5281,6 +5540,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5281 .unused,5540 .unused,
5282 },5541 },
5283 .dst_temps = .{.{ .rc = .general_purpose }},5542 .dst_temps = .{.{ .rc = .general_purpose }},
5543 .clobbers = .{ .eflags = true },
5284 .each = .{ .once = &.{5544 .each = .{ .once = &.{
5285 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },5545 .{ ._, ._, .mov, .tmp0d, .sia(-16, .src0, .add_size), ._, ._ },
5286 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },5546 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5309,6 +5569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5309,6 +5569,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5309 .unused,5569 .unused,
5310 },5570 },
5311 .dst_temps = .{.{ .rc = .general_purpose }},5571 .dst_temps = .{.{ .rc = .general_purpose }},
5572 .clobbers = .{ .eflags = true },
5312 .each = .{ .once = &.{5573 .each = .{ .once = &.{
5313 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5574 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
5314 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },5575 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5338,6 +5599,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5338,6 +5599,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5338 .unused,5599 .unused,
5339 },5600 },
5340 .dst_temps = .{.{ .rc = .general_purpose }},5601 .dst_temps = .{.{ .rc = .general_purpose }},
5602 .clobbers = .{ .eflags = true },
5341 .each = .{ .once = &.{5603 .each = .{ .once = &.{
5342 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5604 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
5343 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },5605 .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5366,6 +5628,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5366,6 +5628,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5366 .unused,5628 .unused,
5367 },5629 },
5368 .dst_temps = .{.{ .rc = .general_purpose }},5630 .dst_temps = .{.{ .rc = .general_purpose }},
5631 .clobbers = .{ .eflags = true },
5369 .each = .{ .once = &.{5632 .each = .{ .once = &.{
5370 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },5633 .{ ._, ._, .mov, .tmp0d, .sia(-8, .src0, .add_size), ._, ._ },
5371 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },5634 .{ ._, ._, .mov, .dst0q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5394,6 +5657,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5394,6 +5657,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5394 .unused,5657 .unused,
5395 },5658 },
5396 .dst_temps = .{.mem},5659 .dst_temps = .{.mem},
5660 .clobbers = .{ .eflags = true },
5397 .each = .{ .once = &.{5661 .each = .{ .once = &.{
5398 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5662 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5399 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },5663 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
...@@ -5419,6 +5683,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5419,6 +5683,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5419 .unused,5683 .unused,
5420 },5684 },
5421 .dst_temps = .{.mem},5685 .dst_temps = .{.mem},
5686 .clobbers = .{ .eflags = true },
5422 .each = .{ .once = &.{5687 .each = .{ .once = &.{
5423 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5688 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5424 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },5689 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
...@@ -5444,6 +5709,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5444,6 +5709,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5444 .unused,5709 .unused,
5445 },5710 },
5446 .dst_temps = .{.mem},5711 .dst_temps = .{.mem},
5712 .clobbers = .{ .eflags = true },
5447 .each = .{ .once = &.{5713 .each = .{ .once = &.{
5448 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5714 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5449 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },5715 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
...@@ -5469,6 +5735,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5469,6 +5735,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5469 .unused,5735 .unused,
5470 },5736 },
5471 .dst_temps = .{.mem},5737 .dst_temps = .{.mem},
5738 .clobbers = .{ .eflags = true },
5472 .each = .{ .once = &.{5739 .each = .{ .once = &.{
5473 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5740 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5474 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },5741 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
...@@ -5494,6 +5761,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5494,6 +5761,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5494 .unused,5761 .unused,
5495 },5762 },
5496 .dst_temps = .{.mem},5763 .dst_temps = .{.mem},
5764 .clobbers = .{ .eflags = true },
5497 .each = .{ .once = &.{5765 .each = .{ .once = &.{
5498 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5766 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5499 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },5767 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
...@@ -5519,6 +5787,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5519,6 +5787,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5519 .unused,5787 .unused,
5520 },5788 },
5521 .dst_temps = .{.mem},5789 .dst_temps = .{.mem},
5790 .clobbers = .{ .eflags = true },
5522 .each = .{ .once = &.{5791 .each = .{ .once = &.{
5523 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5792 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5524 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },5793 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
...@@ -5544,6 +5813,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5544,6 +5813,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5544 .unused,5813 .unused,
5545 },5814 },
5546 .dst_temps = .{.mem},5815 .dst_temps = .{.mem},
5816 .clobbers = .{ .eflags = true },
5547 .each = .{ .once = &.{5817 .each = .{ .once = &.{
5548 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5818 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5549 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },5819 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5569,6 +5839,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5569,6 +5839,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5569 .unused,5839 .unused,
5570 },5840 },
5571 .dst_temps = .{.mem},5841 .dst_temps = .{.mem},
5842 .clobbers = .{ .eflags = true },
5572 .each = .{ .once = &.{5843 .each = .{ .once = &.{
5573 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5844 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5574 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },5845 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -5594,6 +5865,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5594,6 +5865,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5594 .unused,5865 .unused,
5595 },5866 },
5596 .dst_temps = .{.mem},5867 .dst_temps = .{.mem},
5868 .clobbers = .{ .eflags = true },
5597 .each = .{ .once = &.{5869 .each = .{ .once = &.{
5598 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5870 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5599 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },5871 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -5622,6 +5894,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5622,6 +5894,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5622 .unused,5894 .unused,
5623 },5895 },
5624 .dst_temps = .{.mem},5896 .dst_temps = .{.mem},
5897 .clobbers = .{ .eflags = true },
5625 .each = .{ .once = &.{5898 .each = .{ .once = &.{
5626 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5899 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5627 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },5900 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -5650,6 +5923,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5650,6 +5923,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5650 .unused,5923 .unused,
5651 },5924 },
5652 .dst_temps = .{.mem},5925 .dst_temps = .{.mem},
5926 .clobbers = .{ .eflags = true },
5653 .each = .{ .once = &.{5927 .each = .{ .once = &.{
5654 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5928 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5655 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },5929 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
...@@ -5678,6 +5952,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5678,6 +5952,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5678 .unused,5952 .unused,
5679 },5953 },
5680 .dst_temps = .{.mem},5954 .dst_temps = .{.mem},
5955 .clobbers = .{ .eflags = true },
5681 .each = .{ .once = &.{5956 .each = .{ .once = &.{
5682 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5957 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5683 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },5958 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
...@@ -5706,6 +5981,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5706,6 +5981,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5706 .unused,5981 .unused,
5707 },5982 },
5708 .dst_temps = .{.mem},5983 .dst_temps = .{.mem},
5984 .clobbers = .{ .eflags = true },
5709 .each = .{ .once = &.{5985 .each = .{ .once = &.{
5710 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },5986 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5711 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },5987 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
...@@ -5732,6 +6008,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5732,6 +6008,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5732 .unused,6008 .unused,
5733 },6009 },
5734 .dst_temps = .{.mem},6010 .dst_temps = .{.mem},
6011 .clobbers = .{ .eflags = true },
5735 .each = .{ .once = &.{6012 .each = .{ .once = &.{
5736 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6013 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5737 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },6014 .{ .@"0:", ._, .movzx, .tmp1d, .memia(.src0b, .tmp0, .add_len), ._, ._ },
...@@ -5759,6 +6036,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5759,6 +6036,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5759 .unused,6036 .unused,
5760 },6037 },
5761 .dst_temps = .{.mem},6038 .dst_temps = .{.mem},
6039 .clobbers = .{ .eflags = true },
5762 .each = .{ .once = &.{6040 .each = .{ .once = &.{
5763 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6041 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5764 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6042 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -5787,6 +6065,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5787,6 +6065,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5787 .unused,6065 .unused,
5788 },6066 },
5789 .dst_temps = .{.mem},6067 .dst_temps = .{.mem},
6068 .clobbers = .{ .eflags = true },
5790 .each = .{ .once = &.{6069 .each = .{ .once = &.{
5791 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6070 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5792 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6071 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -5815,6 +6094,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5815,6 +6094,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5815 .unused,6094 .unused,
5816 },6095 },
5817 .dst_temps = .{.mem},6096 .dst_temps = .{.mem},
6097 .clobbers = .{ .eflags = true },
5818 .each = .{ .once = &.{6098 .each = .{ .once = &.{
5819 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6099 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5820 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6100 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
...@@ -5843,6 +6123,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5843,6 +6123,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5843 .unused,6123 .unused,
5844 },6124 },
5845 .dst_temps = .{.mem},6125 .dst_temps = .{.mem},
6126 .clobbers = .{ .eflags = true },
5846 .each = .{ .once = &.{6127 .each = .{ .once = &.{
5847 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6128 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5848 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6129 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
...@@ -5871,6 +6152,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5871,6 +6152,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5871 .unused,6152 .unused,
5872 },6153 },
5873 .dst_temps = .{.mem},6154 .dst_temps = .{.mem},
6155 .clobbers = .{ .eflags = true },
5874 .each = .{ .once = &.{6156 .each = .{ .once = &.{
5875 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6157 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5876 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6158 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
...@@ -5897,6 +6179,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5897,6 +6179,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5897 .unused,6179 .unused,
5898 },6180 },
5899 .dst_temps = .{.mem},6181 .dst_temps = .{.mem},
6182 .clobbers = .{ .eflags = true },
5900 .each = .{ .once = &.{6183 .each = .{ .once = &.{
5901 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6184 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5902 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },6185 .{ .@"0:", ._, .movzx, .tmp1d, .memsia(.src0w, .@"2", .tmp0, .add_2_len), ._, ._ },
...@@ -5924,6 +6207,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5924,6 +6207,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5924 .unused,6207 .unused,
5925 },6208 },
5926 .dst_temps = .{.mem},6209 .dst_temps = .{.mem},
6210 .clobbers = .{ .eflags = true },
5927 .each = .{ .once = &.{6211 .each = .{ .once = &.{
5928 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6212 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5929 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6213 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -5952,6 +6236,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5952,6 +6236,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5952 .unused,6236 .unused,
5953 },6237 },
5954 .dst_temps = .{.mem},6238 .dst_temps = .{.mem},
6239 .clobbers = .{ .eflags = true },
5955 .each = .{ .once = &.{6240 .each = .{ .once = &.{
5956 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6241 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5957 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6242 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -5980,6 +6265,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -5980,6 +6265,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
5980 .unused,6265 .unused,
5981 },6266 },
5982 .dst_temps = .{.mem},6267 .dst_temps = .{.mem},
6268 .clobbers = .{ .eflags = true },
5983 .each = .{ .once = &.{6269 .each = .{ .once = &.{
5984 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6270 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
5985 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },6271 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
...@@ -6008,6 +6294,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6008,6 +6294,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6008 .unused,6294 .unused,
6009 },6295 },
6010 .dst_temps = .{.mem},6296 .dst_temps = .{.mem},
6297 .clobbers = .{ .eflags = true },
6011 .each = .{ .once = &.{6298 .each = .{ .once = &.{
6012 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6299 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6013 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },6300 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
...@@ -6036,6 +6323,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6036,6 +6323,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6036 .unused,6323 .unused,
6037 },6324 },
6038 .dst_temps = .{.mem},6325 .dst_temps = .{.mem},
6326 .clobbers = .{ .eflags = true },
6039 .each = .{ .once = &.{6327 .each = .{ .once = &.{
6040 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6328 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6041 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },6329 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
...@@ -6062,6 +6350,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6062,6 +6350,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6062 .unused,6350 .unused,
6063 },6351 },
6064 .dst_temps = .{.mem},6352 .dst_temps = .{.mem},
6353 .clobbers = .{ .eflags = true },
6065 .each = .{ .once = &.{6354 .each = .{ .once = &.{
6066 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6355 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6067 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },6356 .{ .@"0:", ._, .mov, .tmp1d, .memsia(.src0d, .@"4", .tmp0, .add_4_len), ._, ._ },
...@@ -6089,6 +6378,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6089,6 +6378,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6089 .unused,6378 .unused,
6090 },6379 },
6091 .dst_temps = .{.mem},6380 .dst_temps = .{.mem},
6381 .clobbers = .{ .eflags = true },
6092 .each = .{ .once = &.{6382 .each = .{ .once = &.{
6093 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6383 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6094 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6384 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -6117,6 +6407,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6117,6 +6407,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6117 .unused,6407 .unused,
6118 },6408 },
6119 .dst_temps = .{.mem},6409 .dst_temps = .{.mem},
6410 .clobbers = .{ .eflags = true },
6120 .each = .{ .once = &.{6411 .each = .{ .once = &.{
6121 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6412 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6122 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },6413 .{ ._, ._, .mov, .tmp1d, .si(0xff), ._, ._ },
...@@ -6145,6 +6436,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6145,6 +6436,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6145 .unused,6436 .unused,
6146 },6437 },
6147 .dst_temps = .{.mem},6438 .dst_temps = .{.mem},
6439 .clobbers = .{ .eflags = true },
6148 .each = .{ .once = &.{6440 .each = .{ .once = &.{
6149 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6441 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6150 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6442 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -6173,6 +6465,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6173,6 +6465,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6173 .unused,6465 .unused,
6174 },6466 },
6175 .dst_temps = .{.mem},6467 .dst_temps = .{.mem},
6468 .clobbers = .{ .eflags = true },
6176 .each = .{ .once = &.{6469 .each = .{ .once = &.{
6177 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6470 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6178 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6471 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -6201,6 +6494,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6201,6 +6494,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6201 .unused,6494 .unused,
6202 },6495 },
6203 .dst_temps = .{.mem},6496 .dst_temps = .{.mem},
6497 .clobbers = .{ .eflags = true },
6204 .each = .{ .once = &.{6498 .each = .{ .once = &.{
6205 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6499 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6206 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6500 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -6228,6 +6522,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6228,6 +6522,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6228 .unused,6522 .unused,
6229 },6523 },
6230 .dst_temps = .{.mem},6524 .dst_temps = .{.mem},
6525 .clobbers = .{ .eflags = true },
6231 .each = .{ .once = &.{6526 .each = .{ .once = &.{
6232 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6527 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6233 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },6528 .{ .@"0:", ._, .mov, .tmp1q, .ua(.src0, .add_umax), ._, ._ },
...@@ -6256,6 +6551,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6256,6 +6551,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6256 .unused,6551 .unused,
6257 },6552 },
6258 .dst_temps = .{.mem},6553 .dst_temps = .{.mem},
6554 .clobbers = .{ .eflags = true },
6259 .each = .{ .once = &.{6555 .each = .{ .once = &.{
6260 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6556 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6261 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6557 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6292,6 +6588,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6292,6 +6588,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6292 .unused,6588 .unused,
6293 },6589 },
6294 .dst_temps = .{.mem},6590 .dst_temps = .{.mem},
6591 .clobbers = .{ .eflags = true },
6295 .each = .{ .once = &.{6592 .each = .{ .once = &.{
6296 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6593 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6297 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6594 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6327,6 +6624,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6327,6 +6624,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6327 .unused,6624 .unused,
6328 },6625 },
6329 .dst_temps = .{.mem},6626 .dst_temps = .{.mem},
6627 .clobbers = .{ .eflags = true },
6330 .each = .{ .once = &.{6628 .each = .{ .once = &.{
6331 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6629 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6332 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6630 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6362,6 +6660,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6362,6 +6660,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6362 .unused,6660 .unused,
6363 },6661 },
6364 .dst_temps = .{.mem},6662 .dst_temps = .{.mem},
6663 .clobbers = .{ .eflags = true },
6365 .each = .{ .once = &.{6664 .each = .{ .once = &.{
6366 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6665 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6367 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6666 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6398,6 +6697,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6398,6 +6697,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6398 .unused,6697 .unused,
6399 },6698 },
6400 .dst_temps = .{.mem},6699 .dst_temps = .{.mem},
6700 .clobbers = .{ .eflags = true },
6401 .each = .{ .once = &.{6701 .each = .{ .once = &.{
6402 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6702 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6403 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6703 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6433,6 +6733,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6433,6 +6733,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6433 .unused,6733 .unused,
6434 },6734 },
6435 .dst_temps = .{.mem},6735 .dst_temps = .{.mem},
6736 .clobbers = .{ .eflags = true },
6436 .each = .{ .once = &.{6737 .each = .{ .once = &.{
6437 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6738 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6438 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6739 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6468,6 +6769,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6468,6 +6769,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6468 .unused,6769 .unused,
6469 },6770 },
6470 .dst_temps = .{.mem},6771 .dst_temps = .{.mem},
6772 .clobbers = .{ .eflags = true },
6471 .each = .{ .once = &.{6773 .each = .{ .once = &.{
6472 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6774 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6473 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6775 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6504,6 +6806,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6504,6 +6806,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6504 .unused,6806 .unused,
6505 },6807 },
6506 .dst_temps = .{.mem},6808 .dst_temps = .{.mem},
6809 .clobbers = .{ .eflags = true },
6507 .each = .{ .once = &.{6810 .each = .{ .once = &.{
6508 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6811 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6509 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6812 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6539,6 +6842,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6539,6 +6842,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6539 .unused,6842 .unused,
6540 },6843 },
6541 .dst_temps = .{.mem},6844 .dst_temps = .{.mem},
6845 .clobbers = .{ .eflags = true },
6542 .each = .{ .once = &.{6846 .each = .{ .once = &.{
6543 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6847 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6544 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6848 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6574,6 +6878,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6574,6 +6878,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6574 .unused,6878 .unused,
6575 },6879 },
6576 .dst_temps = .{.mem},6880 .dst_temps = .{.mem},
6881 .clobbers = .{ .eflags = true },
6577 .each = .{ .once = &.{6882 .each = .{ .once = &.{
6578 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6883 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6579 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6884 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6610,6 +6915,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6610,6 +6915,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6610 .unused,6915 .unused,
6611 },6916 },
6612 .dst_temps = .{.mem},6917 .dst_temps = .{.mem},
6918 .clobbers = .{ .eflags = true },
6613 .each = .{ .once = &.{6919 .each = .{ .once = &.{
6614 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6920 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6615 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6921 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6645,6 +6951,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6645,6 +6951,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6645 .unused,6951 .unused,
6646 },6952 },
6647 .dst_temps = .{.mem},6953 .dst_temps = .{.mem},
6954 .clobbers = .{ .eflags = true },
6648 .each = .{ .once = &.{6955 .each = .{ .once = &.{
6649 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },6956 .{ ._, ._, .mov, .tmp0p, .sa(.src0, .sub_len), ._, ._ },
6650 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },6957 .{ ._, ._, .lea, .tmp1q, .mem(.src0), ._, ._ },
...@@ -6672,7 +6979,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -6672,7 +6979,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
6672 }),6979 }),
6673 else => |e| return e,6980 else => |e| return e,
6674 };6981 };
6675 if (ops[0].index != res[0].index) try ops[0].die(cg);6982 for (ops) |op| for (res) |r| {
6983 if (op.index == r.index) break;
6984 } else try op.die(cg);
6676 try res[0].moveTo(inst, cg);6985 try res[0].moveTo(inst, cg);
6677 },6986 },
66786987
...@@ -8480,8 +8789,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -8480,8 +8789,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
8480 .gte => unreachable,8789 .gte => unreachable,
8481 .gt => unreachable,8790 .gt => unreachable,
8482 }8791 }
8483 if (ops[0].index != res[0].index) try ops[0].die(cg);8792 for (ops) |op| for (res) |r| {
8484 if (ops[1].index != res[0].index) try ops[1].die(cg);8793 if (op.index == r.index) break;
8794 } else try op.die(cg);
8485 try res[0].moveTo(inst, cg);8795 try res[0].moveTo(inst, cg);
8486 },8796 },
84878797
...@@ -8678,8 +8988,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -8678,8 +8988,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
8678 }),8988 }),
8679 else => |e| return e,8989 else => |e| return e,
8680 };8990 };
8681 if (ops[0].index != res[0].index) try ops[0].die(cg);8991 for (ops) |op| for (res) |r| {
8682 if (ops[1].index != res[0].index) try ops[1].die(cg);8992 if (op.index == r.index) break;
8993 } else try op.die(cg);
8683 try res[0].moveTo(inst, cg);8994 try res[0].moveTo(inst, cg);
8684 },8995 },
8685 .cmp_eq,8996 .cmp_eq,
...@@ -9155,8 +9466,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9155,8 +9466,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9155 }),9466 }),
9156 else => |e| return e,9467 else => |e| return e,
9157 };9468 };
9158 if (ops[0].index != res[0].index) try ops[0].die(cg);9469 for (ops) |op| for (res) |r| {
9159 if (ops[1].index != res[0].index) try ops[1].die(cg);9470 if (op.index == r.index) break;
9471 } else try op.die(cg);
9160 try res[0].moveTo(inst, cg);9472 try res[0].moveTo(inst, cg);
9161 },9473 },
91629474
...@@ -9294,7 +9606,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9294,7 +9606,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9294 .int_from_ptr => if (use_old) try cg.airIntFromPtr(inst) else {9606 .int_from_ptr => if (use_old) try cg.airIntFromPtr(inst) else {
9295 const un_op = air_datas[@intFromEnum(inst)].un_op;9607 const un_op = air_datas[@intFromEnum(inst)].un_op;
9296 var ops = try cg.tempsFromOperands(inst, .{un_op});9608 var ops = try cg.tempsFromOperands(inst, .{un_op});
9297 try ops[0].toLimb(0, cg);9609 try ops[0].toSlicePtr(cg);
9298 try ops[0].moveTo(inst, cg);9610 try ops[0].moveTo(inst, cg);
9299 },9611 },
9300 .int_from_bool => if (use_old) try cg.airIntFromBool(inst) else {9612 .int_from_bool => if (use_old) try cg.airIntFromBool(inst) else {
...@@ -9422,13 +9734,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9422,13 +9734,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9422 .slice_len => if (use_old) try cg.airSliceLen(inst) else {9734 .slice_len => if (use_old) try cg.airSliceLen(inst) else {
9423 const ty_op = air_datas[@intFromEnum(inst)].ty_op;9735 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
9424 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});9736 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
9425 try ops[0].toLimb(1, cg);9737 try ops[0].toSliceLen(cg);
9426 try ops[0].moveTo(inst, cg);9738 try ops[0].moveTo(inst, cg);
9427 },9739 },
9428 .slice_ptr => if (use_old) try cg.airSlicePtr(inst) else {9740 .slice_ptr => if (use_old) try cg.airSlicePtr(inst) else {
9429 const ty_op = air_datas[@intFromEnum(inst)].ty_op;9741 const ty_op = air_datas[@intFromEnum(inst)].ty_op;
9430 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});9742 var ops = try cg.tempsFromOperands(inst, .{ty_op.operand});
9431 try ops[0].toLimb(0, cg);9743 try ops[0].toSlicePtr(cg);
9432 try ops[0].moveTo(inst, cg);9744 try ops[0].moveTo(inst, cg);
9433 },9745 },
9434 .ptr_slice_len_ptr => if (use_old) try cg.airPtrSliceLenPtr(inst) else {9746 .ptr_slice_len_ptr => if (use_old) try cg.airPtrSliceLenPtr(inst) else {
...@@ -9450,17 +9762,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9450,17 +9762,21 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9450 } else {9762 } else {
9451 const bin_op = air_datas[@intFromEnum(inst)].bin_op;9763 const bin_op = air_datas[@intFromEnum(inst)].bin_op;
9452 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });9764 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
9453 switch (air_tag) {9765 try ops[0].toSlicePtr(cg);
9454 else => unreachable,
9455 .slice_elem_val => try ops[0].toLimb(0, cg),
9456 .ptr_elem_val => {},
9457 }
9458 var res: [1]Temp = undefined;9766 var res: [1]Temp = undefined;
9459 const res_ty = cg.typeOfIndex(inst);9767 const res_ty = cg.typeOfIndex(inst);
9460 cg.select(&res, &.{res_ty}, &ops, comptime &.{ .{9768 cg.select(&res, &.{res_ty}, &ops, comptime &.{ .{
9461 .dst_constraints = .{.{ .int = .byte }},9769 .dst_constraints = .{.{ .int = .byte }},
9462 .patterns = &.{9770 .patterns = &.{
9463 .{ .src = .{ .to_gpr, .simm32 } },9771 .{ .src = .{ .to_gpr, .simm32 } },
9772 },
9773 .dst_temps = .{.{ .rc = .general_purpose }},
9774 .each = .{ .once = &.{
9775 .{ ._, ._, .movzx, .dst0d, .leaa(.byte, .src0, .add_src0_elem_size_times_src1), ._, ._ },
9776 } },
9777 }, .{
9778 .dst_constraints = .{.{ .int = .byte }},
9779 .patterns = &.{
9464 .{ .src = .{ .to_gpr, .to_gpr } },9780 .{ .src = .{ .to_gpr, .to_gpr } },
9465 },9781 },
9466 .dst_temps = .{.{ .rc = .general_purpose }},9782 .dst_temps = .{.{ .rc = .general_purpose }},
...@@ -9471,6 +9787,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9471,6 +9787,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9471 .dst_constraints = .{.{ .int = .word }},9787 .dst_constraints = .{.{ .int = .word }},
9472 .patterns = &.{9788 .patterns = &.{
9473 .{ .src = .{ .to_gpr, .simm32 } },9789 .{ .src = .{ .to_gpr, .simm32 } },
9790 },
9791 .dst_temps = .{.{ .rc = .general_purpose }},
9792 .each = .{ .once = &.{
9793 .{ ._, ._, .movzx, .dst0d, .leaa(.word, .src0, .add_src0_elem_size_times_src1), ._, ._ },
9794 } },
9795 }, .{
9796 .dst_constraints = .{.{ .int = .word }},
9797 .patterns = &.{
9474 .{ .src = .{ .to_gpr, .to_gpr } },9798 .{ .src = .{ .to_gpr, .to_gpr } },
9475 },9799 },
9476 .dst_temps = .{.{ .rc = .general_purpose }},9800 .dst_temps = .{.{ .rc = .general_purpose }},
...@@ -9481,6 +9805,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9481,6 +9805,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9481 .dst_constraints = .{.{ .int = .dword }},9805 .dst_constraints = .{.{ .int = .dword }},
9482 .patterns = &.{9806 .patterns = &.{
9483 .{ .src = .{ .to_gpr, .simm32 } },9807 .{ .src = .{ .to_gpr, .simm32 } },
9808 },
9809 .dst_temps = .{.{ .rc = .general_purpose }},
9810 .each = .{ .once = &.{
9811 .{ ._, ._, .mov, .dst0d, .leaa(.dword, .src0, .add_src0_elem_size_times_src1), ._, ._ },
9812 } },
9813 }, .{
9814 .dst_constraints = .{.{ .int = .dword }},
9815 .patterns = &.{
9484 .{ .src = .{ .to_gpr, .to_gpr } },9816 .{ .src = .{ .to_gpr, .to_gpr } },
9485 },9817 },
9486 .dst_temps = .{.{ .rc = .general_purpose }},9818 .dst_temps = .{.{ .rc = .general_purpose }},
...@@ -9488,10 +9820,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9488,10 +9820,18 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9488 .{ ._, ._, .mov, .dst0d, .leasi(.dword, .src0, .@"4", .src1), ._, ._ },9820 .{ ._, ._, .mov, .dst0d, .leasi(.dword, .src0, .@"4", .src1), ._, ._ },
9489 } },9821 } },
9490 }, .{9822 }, .{
9491 .required_features = .{ .@"64bit", null, null, null },
9492 .dst_constraints = .{.{ .int = .qword }},9823 .dst_constraints = .{.{ .int = .qword }},
9493 .patterns = &.{9824 .patterns = &.{
9494 .{ .src = .{ .to_gpr, .simm32 } },9825 .{ .src = .{ .to_gpr, .simm32 } },
9826 },
9827 .dst_temps = .{.{ .rc = .general_purpose }},
9828 .each = .{ .once = &.{
9829 .{ ._, ._, .mov, .dst0q, .leaa(.qword, .src0, .add_src0_elem_size_times_src1), ._, ._ },
9830 } },
9831 }, .{
9832 .required_features = .{ .@"64bit", null, null, null },
9833 .dst_constraints = .{.{ .int = .qword }},
9834 .patterns = &.{
9495 .{ .src = .{ .to_gpr, .to_gpr } },9835 .{ .src = .{ .to_gpr, .to_gpr } },
9496 },9836 },
9497 .dst_temps = .{.{ .rc = .general_purpose }},9837 .dst_temps = .{.{ .rc = .general_purpose }},
...@@ -9543,8 +9883,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9543,8 +9883,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9543 },9883 },
9544 else => |e| return e,9884 else => |e| return e,
9545 };9885 };
9546 if (ops[0].index != res[0].index) try ops[0].die(cg);9886 for (ops) |op| for (res) |r| {
9547 if (ops[1].index != res[0].index) try ops[1].die(cg);9887 if (op.index == r.index) break;
9888 } else try op.die(cg);
9548 try res[0].moveTo(inst, cg);9889 try res[0].moveTo(inst, cg);
9549 },9890 },
9550 .slice_elem_ptr, .ptr_elem_ptr => |air_tag| if (use_old) switch (air_tag) {9891 .slice_elem_ptr, .ptr_elem_ptr => |air_tag| if (use_old) switch (air_tag) {
...@@ -9555,11 +9896,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -9555,11 +9896,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
9555 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;9896 const ty_pl = air_datas[@intFromEnum(inst)].ty_pl;
9556 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;9897 const bin_op = cg.air.extraData(Air.Bin, ty_pl.payload).data;
9557 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });9898 var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs });
9558 switch (air_tag) {9899 try ops[0].toSlicePtr(cg);
9559 else => unreachable,
9560 .slice_elem_ptr => try ops[0].toLimb(0, cg),
9561 .ptr_elem_ptr => {},
9562 }
9563 const dst_ty = cg.typeOfIndex(inst);9900 const dst_ty = cg.typeOfIndex(inst);
9564 if (dst_ty.ptrInfo(zcu).flags.vector_index == .none) zero_offset: {9901 if (dst_ty.ptrInfo(zcu).flags.vector_index == .none) zero_offset: {
9565 const elem_size = dst_ty.childType(zcu).abiSize(zcu);9902 const elem_size = dst_ty.childType(zcu).abiSize(zcu);
...@@ -27687,9 +28024,9 @@ const Temp = struct {...@@ -27687,9 +28024,9 @@ const Temp = struct {
27687 temp.* = new_temp;28024 temp.* = new_temp;
27688 }28025 }
2768928026
27690 fn getLimb(temp: Temp, limb_index: u28, cg: *CodeGen) !Temp {28027 fn getLimb(temp: Temp, limb_ty: Type, limb_index: u28, cg: *CodeGen) !Temp {
27691 const new_temp_index = cg.next_temp_index;28028 const new_temp_index = cg.next_temp_index;
27692 cg.temp_type[@intFromEnum(new_temp_index)] = .usize;28029 cg.temp_type[@intFromEnum(new_temp_index)] = limb_ty;
27693 switch (temp.tracking(cg).short) {28030 switch (temp.tracking(cg).short) {
27694 else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),28031 else => |mcv| std.debug.panic("{s}: {}\n", .{ @src().fn_name, mcv }),
27695 .immediate => |imm| {28032 .immediate => |imm| {
...@@ -27759,7 +28096,7 @@ const Temp = struct {...@@ -27759,7 +28096,7 @@ const Temp = struct {
27759 return .{ .index = new_temp_index.toIndex() };28096 return .{ .index = new_temp_index.toIndex() };
27760 }28097 }
2776128098
27762 fn toLimb(temp: *Temp, limb_index: u28, cg: *CodeGen) !void {28099 fn toLimb(temp: *Temp, limb_ty: Type, limb_index: u28, cg: *CodeGen) !void {
27763 switch (temp.unwrap(cg)) {28100 switch (temp.unwrap(cg)) {
27764 .ref => {},28101 .ref => {},
27765 .temp => |temp_index| {28102 .temp => |temp_index| {
...@@ -27768,7 +28105,7 @@ const Temp = struct {...@@ -27768,7 +28105,7 @@ const Temp = struct {
27768 else => {},28105 else => {},
27769 .register, .lea_symbol, .lea_frame => {28106 .register, .lea_symbol, .lea_frame => {
27770 assert(limb_index == 0);28107 assert(limb_index == 0);
27771 cg.temp_type[@intFromEnum(temp_index)] = .usize;28108 cg.temp_type[@intFromEnum(temp_index)] = limb_ty;
27772 return;28109 return;
27773 },28110 },
27774 .register_pair => |regs| {28111 .register_pair => |regs| {
...@@ -27780,7 +28117,7 @@ const Temp = struct {...@@ -27780,7 +28117,7 @@ const Temp = struct {
27780 for (regs, 0..) |reg, reg_index| if (reg_index != limb_index)28117 for (regs, 0..) |reg, reg_index| if (reg_index != limb_index)
27781 cg.register_manager.freeReg(reg);28118 cg.register_manager.freeReg(reg);
27782 temp_tracking.* = .init(.{ .register = regs[limb_index] });28119 temp_tracking.* = .init(.{ .register = regs[limb_index] });
27783 cg.temp_type[@intFromEnum(temp_index)] = .usize;28120 cg.temp_type[@intFromEnum(temp_index)] = limb_ty;
27784 return;28121 return;
27785 },28122 },
27786 .load_symbol => |sym_off| {28123 .load_symbol => |sym_off| {
...@@ -27789,7 +28126,7 @@ const Temp = struct {...@@ -27789,7 +28126,7 @@ const Temp = struct {
27789 .sym_index = sym_off.sym_index,28126 .sym_index = sym_off.sym_index,
27790 .off = sym_off.off + @as(u31, limb_index) * 8,28127 .off = sym_off.off + @as(u31, limb_index) * 8,
27791 } });28128 } });
27792 cg.temp_type[@intFromEnum(temp_index)] = .usize;28129 cg.temp_type[@intFromEnum(temp_index)] = limb_ty;
27793 return;28130 return;
27794 },28131 },
27795 .load_frame => |frame_addr| if (!frame_addr.index.isNamed()) {28132 .load_frame => |frame_addr| if (!frame_addr.index.isNamed()) {
...@@ -27798,17 +28135,26 @@ const Temp = struct {...@@ -27798,17 +28135,26 @@ const Temp = struct {
27798 .index = frame_addr.index,28135 .index = frame_addr.index,
27799 .off = frame_addr.off + @as(u31, limb_index) * 8,28136 .off = frame_addr.off + @as(u31, limb_index) * 8,
27800 } });28137 } });
27801 cg.temp_type[@intFromEnum(temp_index)] = .usize;28138 cg.temp_type[@intFromEnum(temp_index)] = limb_ty;
27802 return;28139 return;
27803 },28140 },
27804 }28141 }
27805 },28142 },
27806 }28143 }
27807 const new_temp = try temp.getLimb(limb_index, cg);28144 const new_temp = try temp.getLimb(limb_ty, limb_index, cg);
27808 try temp.die(cg);28145 try temp.die(cg);
27809 temp.* = new_temp;28146 temp.* = new_temp;
27810 }28147 }
2781128148
28149 fn toSlicePtr(temp: *Temp, cg: *CodeGen) !void {
28150 const temp_ty = temp.typeOf(cg);
28151 if (temp_ty.isSlice(cg.pt.zcu)) try temp.toLimb(temp_ty.slicePtrFieldType(cg.pt.zcu), 0, cg);
28152 }
28153
28154 fn toSliceLen(temp: *Temp, cg: *CodeGen) !void {
28155 try temp.toLimb(.usize, 1, cg);
28156 }
28157
27812 fn toReg(temp: *Temp, new_reg: Register, cg: *CodeGen) !bool {28158 fn toReg(temp: *Temp, new_reg: Register, cg: *CodeGen) !bool {
27813 const val, const ty = val_ty: switch (temp.unwrap(cg)) {28159 const val, const ty = val_ty: switch (temp.unwrap(cg)) {
27814 .ref => |ref| .{ temp.tracking(cg).short, cg.typeOf(ref) },28160 .ref => |ref| .{ temp.tracking(cg).short, cg.typeOf(ref) },
...@@ -28325,6 +28671,8 @@ const Select = struct {...@@ -28325,6 +28671,8 @@ const Select = struct {
28325 unsigned_or_exact_remainder_int: struct { of: Memory.Size, is: Memory.Size },28671 unsigned_or_exact_remainder_int: struct { of: Memory.Size, is: Memory.Size },
28326 signed_int: Memory.Size,28672 signed_int: Memory.Size,
28327 unsigned_int: Memory.Size,28673 unsigned_int: Memory.Size,
28674 elem_size_is: u8,
28675 po2_elem_size,
28328 elem_int: Memory.Size,28676 elem_int: Memory.Size,
2832928677
28330 fn accepts(constraint: Constraint, ty: Type, cg: *CodeGen) bool {28678 fn accepts(constraint: Constraint, ty: Type, cg: *CodeGen) bool {
...@@ -28511,8 +28859,10 @@ const Select = struct {...@@ -28511,8 +28859,10 @@ const Select = struct {
28511 const int_info = ty.intInfo(zcu);28859 const int_info = ty.intInfo(zcu);
28512 return int_info.signedness == .unsigned and size.bitSize(cg.target) >= int_info.bits;28860 return int_info.signedness == .unsigned and size.bitSize(cg.target) >= int_info.bits;
28513 },28861 },
28862 .elem_size_is => |size| return size == ty.elemType2(zcu).abiSize(zcu),
28863 .po2_elem_size => return std.math.isPowerOfTwo(ty.elemType2(zcu).abiSize(zcu)),
28514 .elem_int => |size| {28864 .elem_int => |size| {
28515 const elem_ty = ty.childType(zcu);28865 const elem_ty = ty.elemType2(zcu);
28516 if (elem_ty.toIntern() == .bool_type) return true;28866 if (elem_ty.toIntern() == .bool_type) return true;
28517 if (elem_ty.isPtrAtRuntime(zcu)) return size.bitSize(cg.target) >= cg.target.ptrBitWidth();28867 if (elem_ty.isPtrAtRuntime(zcu)) return size.bitSize(cg.target) >= cg.target.ptrBitWidth();
28518 return elem_ty.isAbiInt(zcu) and size.bitSize(cg.target) >= elem_ty.intInfo(zcu).bits;28868 return elem_ty.isAbiInt(zcu) and size.bitSize(cg.target) >= elem_ty.intInfo(zcu).bits;
...@@ -28794,6 +29144,8 @@ const Select = struct {...@@ -28794,6 +29144,8 @@ const Select = struct {
28794 len,29144 len,
28795 elem_limbs,29145 elem_limbs,
28796 src0_elem_size,29146 src0_elem_size,
29147 src0_elem_size_times_src1,
29148 log2_src0_elem_size,
28797 smin,29149 smin,
28798 smax,29150 smax,
28799 umax,29151 umax,
...@@ -28818,7 +29170,13 @@ const Select = struct {...@@ -28818,7 +29170,13 @@ const Select = struct {
28818 const add_len: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .len };29170 const add_len: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .len };
28819 const sub_len: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .len };29171 const sub_len: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .len };
28820 const add_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_elem_size };29172 const add_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_elem_size };
29173 const add_2_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"2", .amount = .src0_elem_size };
29174 const add_4_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"4", .amount = .src0_elem_size };
29175 const add_8_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"8", .amount = .src0_elem_size };
28821 const sub_src0_elem_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_elem_size };29176 const sub_src0_elem_size: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_elem_size };
29177 const add_src0_elem_size_times_src1: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .src0_elem_size_times_src1 };
29178 const sub_src0_elem_size_times_src1: Adjust = .{ .factor = -1, .scale = .@"1", .amount = .src0_elem_size_times_src1 };
29179 const add_log2_src0_elem_size: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .log2_src0_elem_size };
28822 const add_elem_limbs: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .elem_limbs };29180 const add_elem_limbs: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .elem_limbs };
28823 const add_umax: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .umax };29181 const add_umax: Adjust = .{ .factor = 1, .scale = .@"1", .amount = .umax };
28824 };29182 };
...@@ -29190,14 +29548,7 @@ const Select = struct {...@@ -29190,14 +29548,7 @@ const Select = struct {
29190 const UnsignedImm = @Type(.{29548 const UnsignedImm = @Type(.{
29191 .int = .{ .signedness = .unsigned, .bits = @typeInfo(SignedImm).int.bits },29549 .int = .{ .signedness = .unsigned, .bits = @typeInfo(SignedImm).int.bits },
29192 });29550 });
29193 return switch (op.index.ref) {29551 return @as(i5, op.adjust.factor) * op.adjust.scale.toFactor() * @as(SignedImm, switch (op.adjust.amount) {
29194 else => |ref| switch (ref.deref(s).tracking(s.cg).short) {
29195 else => unreachable,
29196 .immediate => |imm| op.index.scale.toFactor() * @as(i32, @intCast(imm)),
29197 .register => 0,
29198 },
29199 .none => 0,
29200 } + @as(i5, op.adjust.factor) * op.adjust.scale.toFactor() * @as(SignedImm, switch (op.adjust.amount) {
29201 .none => 0,29552 .none => 0,
29202 .ptr_size => @divExact(s.cg.target.ptrBitWidth(), 8),29553 .ptr_size => @divExact(s.cg.target.ptrBitWidth(), 8),
29203 .ptr_bit_size => s.cg.target.ptrBitWidth(),29554 .ptr_bit_size => s.cg.target.ptrBitWidth(),
...@@ -29210,7 +29561,10 @@ const Select = struct {...@@ -29210,7 +29561,10 @@ const Select = struct {
29210 op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu),29561 op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu),
29211 @divExact(op.base.size.bitSize(s.cg.target), 8),29562 @divExact(op.base.size.bitSize(s.cg.target), 8),
29212 )),29563 )),
29213 .src0_elem_size => @intCast(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).childType(s.cg.pt.zcu).abiSize(s.cg.pt.zcu)),29564 .src0_elem_size => @intCast(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu)),
29565 .src0_elem_size_times_src1 => @intCast(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu) *
29566 Select.Operand.Ref.src1.deref(s).tracking(s.cg).short.immediate),
29567 .log2_src0_elem_size => @intCast(std.math.log2(Select.Operand.Ref.src0.deref(s).typeOf(s.cg).elemType2(s.cg.pt.zcu).abiSize(s.cg.pt.zcu))),
29214 .smin => @as(SignedImm, std.math.minInt(SignedImm)) >> @truncate(29568 .smin => @as(SignedImm, std.math.minInt(SignedImm)) >> @truncate(
29215 -%op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),29569 -%op.base.ref.deref(s).typeOf(s.cg).scalarType(s.cg.pt.zcu).bitSize(s.cg.pt.zcu),
29216 ),29570 ),
...@@ -29250,11 +29604,7 @@ const Select = struct {...@@ -29250,11 +29604,7 @@ const Select = struct {
29250 .mod = .{ .rm = .{29604 .mod = .{ .rm = .{
29251 .size = op.base.size,29605 .size = op.base.size,
29252 .index = switch (op.index.ref) {29606 .index = switch (op.index.ref) {
29253 else => |ref| switch (ref.deref(s).tracking(s.cg).short) {29607 else => |ref| registerAlias(ref.deref(s).tracking(s.cg).short.register, @divExact(s.cg.target.ptrBitWidth(), 8)),
29254 else => unreachable,
29255 .immediate => .none,
29256 .register => |index_reg| registerAlias(index_reg, @divExact(s.cg.target.ptrBitWidth(), 8)),
29257 },
29258 .none => .none,29608 .none => .none,
29259 },29609 },
29260 .scale = op.index.scale,29610 .scale = op.index.scale,
...@@ -29264,11 +29614,7 @@ const Select = struct {...@@ -29264,11 +29614,7 @@ const Select = struct {
29264 .mem => .{ .mem = try op.base.ref.deref(s).tracking(s.cg).short.mem(s.cg, .{29614 .mem => .{ .mem = try op.base.ref.deref(s).tracking(s.cg).short.mem(s.cg, .{
29265 .size = op.base.size,29615 .size = op.base.size,
29266 .index = switch (op.index.ref) {29616 .index = switch (op.index.ref) {
29267 else => |ref| switch (ref.deref(s).tracking(s.cg).short) {29617 else => |ref| registerAlias(ref.deref(s).tracking(s.cg).short.register, @divExact(s.cg.target.ptrBitWidth(), 8)),
29268 else => unreachable,
29269 .immediate => .none,
29270 .register => |index_reg| registerAlias(index_reg, @divExact(s.cg.target.ptrBitWidth(), 8)),
29271 },
29272 .none => .none,29618 .none => .none,
29273 },29619 },
29274 .scale = op.index.scale,29620 .scale = op.index.scale,
test/behavior/x86_64/mem.zig+8-2
...@@ -4,13 +4,19 @@ fn access(comptime array: anytype) !void {...@@ -4,13 +4,19 @@ fn access(comptime array: anytype) !void {
4 inline for (0.., &array) |ct_index, *elem| {4 inline for (0.., &array) |ct_index, *elem| {
5 var rt_index: usize = undefined;5 var rt_index: usize = undefined;
6 rt_index = ct_index;6 rt_index = ct_index;
7 if (&(slice.ptr + ct_index)[0] != elem) return error.Unexpected;
8 if (&(slice.ptr + rt_index)[0] != elem) return error.Unexpected;
9 if (&slice.ptr[ct_index..][0] != elem) return error.Unexpected;
10 if (&slice.ptr[rt_index..][0] != elem) return error.Unexpected;
7 if (&slice.ptr[ct_index] != elem) return error.Unexpected;11 if (&slice.ptr[ct_index] != elem) return error.Unexpected;
8 if (&slice[ct_index] != elem) return error.Unexpected;
9 if (&slice.ptr[rt_index] != elem) return error.Unexpected;12 if (&slice.ptr[rt_index] != elem) return error.Unexpected;
13 if (&slice[ct_index..].ptr[0] != elem) return error.Unexpected;
14 if (&slice[rt_index..].ptr[0] != elem) return error.Unexpected;
15 if (&slice[ct_index] != elem) return error.Unexpected;
10 if (&slice[rt_index] != elem) return error.Unexpected;16 if (&slice[rt_index] != elem) return error.Unexpected;
11 if (slice.ptr[ct_index] != elem.*) return error.Unexpected;17 if (slice.ptr[ct_index] != elem.*) return error.Unexpected;
12 if (slice[ct_index] != elem.*) return error.Unexpected;
13 if (slice.ptr[rt_index] != elem.*) return error.Unexpected;18 if (slice.ptr[rt_index] != elem.*) return error.Unexpected;
19 if (slice[ct_index] != elem.*) return error.Unexpected;
14 if (slice[rt_index] != elem.*) return error.Unexpected;20 if (slice[rt_index] != elem.*) return error.Unexpected;
15 }21 }
16}22}