| ... | @@ -47,10 +47,11 @@ pub fn legalizeFeatures(target: *const std.Target) *const Air.Legalize.Features | ... | @@ -47,10 +47,11 @@ pub fn legalizeFeatures(target: *const std.Target) *const Air.Legalize.Features |
| 47 | .scalarize_div_float_optimized = use_old, | 47 | .scalarize_div_float_optimized = use_old, |
| 48 | .scalarize_div_trunc = use_old, | 48 | .scalarize_div_trunc = use_old, |
| 49 | .scalarize_div_trunc_optimized = use_old, | 49 | .scalarize_div_trunc_optimized = use_old, |
| 50 | .scalarize_div_floor = use_old, | 50 | .scalarize_div_floor = true, |
| 51 | .scalarize_div_floor_optimized = use_old, | 51 | .scalarize_div_floor_optimized = use_old, |
| 52 | .scalarize_div_exact = use_old, | 52 | .scalarize_div_exact = use_old, |
| 53 | .scalarize_div_exact_optimized = use_old, | 53 | .scalarize_div_exact_optimized = use_old, |
| | 54 | .scalarize_mod = true, |
| 54 | .scalarize_max = use_old, | 55 | .scalarize_max = use_old, |
| 55 | .scalarize_min = use_old, | 56 | .scalarize_min = use_old, |
| 56 | .scalarize_add_with_overflow = true, | 57 | .scalarize_add_with_overflow = true, |
| ... | @@ -690,7 +691,7 @@ const InstTracking = struct { | ... | @@ -690,7 +691,7 @@ const InstTracking = struct { |
| 690 | } | 691 | } |
| 691 | tracking_log.debug("spill {} from {} to {}", .{ inst, self.short, self.long }); | 692 | tracking_log.debug("spill {} from {} to {}", .{ inst, self.short, self.long }); |
| 692 | try cg.genCopy(cg.typeOfIndex(inst), self.long, self.short, .{}); | 693 | try cg.genCopy(cg.typeOfIndex(inst), self.long, self.short, .{}); |
| 693 | for (self.short.getRegs()) |reg| if (reg.class() == .x87) try cg.asmRegister(.{ .f_, .free }, reg); | 694 | for (self.short.getRegs()) |reg| if (reg.isClass(.x87)) try cg.asmRegister(.{ .f_, .free }, reg); |
| 694 | } | 695 | } |
| 695 | | 696 | |
| 696 | fn reuseFrame(self: *InstTracking) void { | 697 | fn reuseFrame(self: *InstTracking) void { |
| ... | @@ -2468,7 +2469,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -2468,7 +2469,7 @@ fn genBodyBlock(self: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 2468 | } | 2469 | } |
| 2469 | | 2470 | |
| 2470 | fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | 2471 | fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 2471 | @setEvalBranchQuota(28_600); | 2472 | @setEvalBranchQuota(28_700); |
| 2472 | const pt = cg.pt; | 2473 | const pt = cg.pt; |
| 2473 | const zcu = pt.zcu; | 2474 | const zcu = pt.zcu; |
| 2474 | const ip = &zcu.intern_pool; | 2475 | const ip = &zcu.intern_pool; |
| ... | @@ -35458,12 +35459,249 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -35458,12 +35459,249 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 35458 | }; | 35459 | }; |
| 35459 | try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); | 35460 | try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); |
| 35460 | }, | 35461 | }, |
| 35461 | .div_floor => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, air_tag) else fallback: { | 35462 | .div_floor => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, air_tag) else { |
| 35462 | const bin_op = air_datas[@intFromEnum(inst)].bin_op; | 35463 | const bin_op = air_datas[@intFromEnum(inst)].bin_op; |
| 35463 | if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airMulDivBinOp(inst, air_tag); | 35464 | const ty = cg.typeOf(bin_op.lhs); |
| 35464 | var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); | 35465 | var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); |
| 35465 | var res: [1]Temp = undefined; | 35466 | var res: [1]Temp = undefined; |
| 35466 | cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{ | 35467 | (if (cg.intInfo(ty)) |int_info| err: switch (int_info.signedness) { |
| | 35468 | .signed => cg.select(&res, &.{ty}, &ops, comptime &.{ .{ |
| | 35469 | .src_constraints = .{ .{ .exact_signed_int = 1 }, .{ .exact_signed_int = 1 }, .any }, |
| | 35470 | .patterns = &.{ |
| | 35471 | .{ .src = .{ .any, .any, .none } }, |
| | 35472 | }, |
| | 35473 | .dst_temps = .{ .{ .imm = 0 }, .unused }, |
| | 35474 | .each = .{ .once = &.{} }, |
| | 35475 | }, .{ |
| | 35476 | .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, |
| | 35477 | .patterns = &.{ |
| | 35478 | .{ .src = .{ .mem, .to_mut_gphi, .none } }, |
| | 35479 | .{ .src = .{ .to_gpr, .to_mut_gphi, .none } }, |
| | 35480 | }, |
| | 35481 | .dst_temps = .{ .{ .reg = .al }, .unused }, |
| | 35482 | .clobbers = .{ .eflags = true }, |
| | 35483 | .each = .{ .once = &.{ |
| | 35484 | .{ ._, ._, .movsx, .dst0d, .src0b, ._, ._ }, |
| | 35485 | .{ ._, .i_, .div, .src1b, ._, ._, ._ }, |
| | 35486 | .{ ._, ._, .@"and", .src1b, .sa(.src0, .add_smin), ._, ._ }, |
| | 35487 | .{ ._, ._, .xor, .src1b, .dst0h, ._, ._ }, |
| | 35488 | .{ ._, ._, .cmp, .src1b, .sia(1, .src0, .add_smin), ._, ._ }, |
| | 35489 | .{ ._, ._, .adc, .dst0b, .si(-1), ._, ._ }, |
| | 35490 | } }, |
| | 35491 | }, .{ |
| | 35492 | .required_features = .{ .fast_imm16, null, null, null }, |
| | 35493 | .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, |
| | 35494 | .patterns = &.{ |
| | 35495 | .{ .src = .{ .{ .to_reg = .ax }, .to_mut_gpr, .none } }, |
| | 35496 | }, |
| | 35497 | .extra_temps = .{ |
| | 35498 | .{ .type = .i16, .kind = .{ .reg = .dx } }, |
| | 35499 | .unused, |
| | 35500 | .unused, |
| | 35501 | .unused, |
| | 35502 | .unused, |
| | 35503 | .unused, |
| | 35504 | .unused, |
| | 35505 | .unused, |
| | 35506 | .unused, |
| | 35507 | .unused, |
| | 35508 | .unused, |
| | 35509 | }, |
| | 35510 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| | 35511 | .clobbers = .{ .eflags = true }, |
| | 35512 | .each = .{ .once = &.{ |
| | 35513 | .{ ._, ._, .cwd, ._, ._, ._, ._ }, |
| | 35514 | .{ ._, .i_, .div, .src1w, ._, ._, ._ }, |
| | 35515 | .{ ._, ._, .@"and", .src1w, .sa(.src0, .add_smin), ._, ._ }, |
| | 35516 | .{ ._, ._, .xor, .src1d, .tmp0d, ._, ._ }, |
| | 35517 | .{ ._, ._, .cmp, .src1w, .sia(1, .src0, .add_smin), ._, ._ }, |
| | 35518 | .{ ._, ._, .adc, .dst0d, .si(-1), ._, ._ }, |
| | 35519 | } }, |
| | 35520 | }, .{ |
| | 35521 | .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, |
| | 35522 | .patterns = &.{ |
| | 35523 | .{ .src = .{ .{ .to_reg = .ax }, .to_mut_gpr, .none } }, |
| | 35524 | }, |
| | 35525 | .extra_temps = .{ |
| | 35526 | .{ .type = .i16, .kind = .{ .reg = .dx } }, |
| | 35527 | .unused, |
| | 35528 | .unused, |
| | 35529 | .unused, |
| | 35530 | .unused, |
| | 35531 | .unused, |
| | 35532 | .unused, |
| | 35533 | .unused, |
| | 35534 | .unused, |
| | 35535 | .unused, |
| | 35536 | .unused, |
| | 35537 | }, |
| | 35538 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| | 35539 | .clobbers = .{ .eflags = true }, |
| | 35540 | .each = .{ .once = &.{ |
| | 35541 | .{ ._, ._, .cwd, ._, ._, ._, ._ }, |
| | 35542 | .{ ._, .i_, .div, .src1w, ._, ._, ._ }, |
| | 35543 | .{ ._, ._, .@"and", .src1d, .sa(.src0, .add_smin), ._, ._ }, |
| | 35544 | .{ ._, ._, .xor, .src1d, .tmp0d, ._, ._ }, |
| | 35545 | .{ ._, ._, .cmp, .src1w, .sia(1, .src0, .add_smin), ._, ._ }, |
| | 35546 | .{ ._, ._, .adc, .dst0d, .si(-1), ._, ._ }, |
| | 35547 | } }, |
| | 35548 | }, .{ |
| | 35549 | .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, |
| | 35550 | .patterns = &.{ |
| | 35551 | .{ .src = .{ .{ .to_reg = .eax }, .to_mut_gpr, .none } }, |
| | 35552 | }, |
| | 35553 | .extra_temps = .{ |
| | 35554 | .{ .type = .i32, .kind = .{ .reg = .edx } }, |
| | 35555 | .unused, |
| | 35556 | .unused, |
| | 35557 | .unused, |
| | 35558 | .unused, |
| | 35559 | .unused, |
| | 35560 | .unused, |
| | 35561 | .unused, |
| | 35562 | .unused, |
| | 35563 | .unused, |
| | 35564 | .unused, |
| | 35565 | }, |
| | 35566 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| | 35567 | .clobbers = .{ .eflags = true }, |
| | 35568 | .each = .{ .once = &.{ |
| | 35569 | .{ ._, ._, .cdq, ._, ._, ._, ._ }, |
| | 35570 | .{ ._, .i_, .div, .src1d, ._, ._, ._ }, |
| | 35571 | .{ ._, ._, .@"and", .src1d, .sa(.src0, .add_smin), ._, ._ }, |
| | 35572 | .{ ._, ._, .xor, .src1d, .tmp0d, ._, ._ }, |
| | 35573 | .{ ._, ._, .cmp, .src1d, .sia(1, .src0, .add_smin), ._, ._ }, |
| | 35574 | .{ ._, ._, .adc, .dst0d, .si(-1), ._, ._ }, |
| | 35575 | } }, |
| | 35576 | }, .{ |
| | 35577 | .required_features = .{ .@"64bit", null, null, null }, |
| | 35578 | .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, |
| | 35579 | .patterns = &.{ |
| | 35580 | .{ .src = .{ .{ .to_reg = .rax }, .to_mut_gpr, .none } }, |
| | 35581 | }, |
| | 35582 | .extra_temps = .{ |
| | 35583 | .{ .type = .i64, .kind = .{ .reg = .rdx } }, |
| | 35584 | .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, |
| | 35585 | .unused, |
| | 35586 | .unused, |
| | 35587 | .unused, |
| | 35588 | .unused, |
| | 35589 | .unused, |
| | 35590 | .unused, |
| | 35591 | .unused, |
| | 35592 | .unused, |
| | 35593 | .unused, |
| | 35594 | }, |
| | 35595 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| | 35596 | .clobbers = .{ .eflags = true }, |
| | 35597 | .each = .{ .once = &.{ |
| | 35598 | .{ ._, ._, .cqo, ._, ._, ._, ._ }, |
| | 35599 | .{ ._, .i_, .div, .src1q, ._, ._, ._ }, |
| | 35600 | .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smin), ._, ._ }, |
| | 35601 | .{ ._, ._, .@"and", .src1q, .tmp1q, ._, ._ }, |
| | 35602 | .{ ._, ._, .xor, .src1q, .tmp0q, ._, ._ }, |
| | 35603 | .{ ._, ._c, .st, ._, ._, ._, ._ }, |
| | 35604 | .{ ._, ._, .sbb, .src1q, .tmp1q, ._, ._ }, |
| | 35605 | .{ ._, ._, .adc, .dst0q, .si(-1), ._, ._ }, |
| | 35606 | } }, |
| | 35607 | }, .{ |
| | 35608 | .required_features = .{ .@"64bit", null, null, null }, |
| | 35609 | .src_constraints = .{ .{ .signed_int = .xword }, .{ .signed_int = .xword }, .any }, |
| | 35610 | .patterns = &.{ |
| | 35611 | .{ .src = .{ .mem, .mem, .none } }, |
| | 35612 | }, |
| | 35613 | .call_frame = .{ .alignment = .@"16" }, |
| | 35614 | .extra_temps = .{ |
| | 35615 | .{ .type = .i128, .kind = .{ .param_gpr_pair = .{ .cc = .ccc, .at = 0 } } }, |
| | 35616 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| | 35617 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modti3" } } }, |
| | 35618 | .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, |
| | 35619 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divti3" } } }, |
| | 35620 | .unused, |
| | 35621 | .unused, |
| | 35622 | .unused, |
| | 35623 | .unused, |
| | 35624 | .unused, |
| | 35625 | .unused, |
| | 35626 | }, |
| | 35627 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| | 35628 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| | 35629 | .each = .{ .once = &.{ |
| | 35630 | .{ ._, ._, .mov, .tmp0q0, .mem(.src0q), ._, ._ }, |
| | 35631 | .{ ._, ._, .mov, .tmp0q1, .memd(.src0q, 8), ._, ._ }, |
| | 35632 | .{ ._, ._, .mov, .dst0q1, .mem(.src1q), ._, ._ }, |
| | 35633 | .{ ._, ._, .mov, .tmp1q, .memd(.src1q, 8), ._, ._ }, |
| | 35634 | .{ ._, ._, .call, .tmp2d, ._, ._, ._ }, |
| | 35635 | .{ ._, ._, .mov, .tmp0q0, .ua(.src0, .add_smin), ._, ._ }, |
| | 35636 | .{ ._, ._, .mov, .tmp1q, .memd(.src1q, 8), ._, ._ }, |
| | 35637 | .{ ._, ._, .mov, .tmp0q1, .tmp0q0, ._, ._ }, |
| | 35638 | .{ ._, ._, .@"and", .tmp0q1, .tmp1q, ._, ._ }, |
| | 35639 | .{ ._, ._, .xor, .tmp0q1, .dst0q1, ._, ._ }, |
| | 35640 | .{ ._, ._, .cmp, .dst0q0, .si(1), ._, ._ }, |
| | 35641 | .{ ._, ._, .sbb, .tmp0q1, .tmp0q0, ._, ._ }, |
| | 35642 | .{ ._, ._, .sbb, .tmp3q, .tmp3q, ._, ._ }, |
| | 35643 | .{ ._, ._, .mov, .tmp0q0, .mem(.src0q), ._, ._ }, |
| | 35644 | .{ ._, ._, .mov, .tmp0q1, .memd(.src0q, 8), ._, ._ }, |
| | 35645 | .{ ._, ._, .mov, .dst0q1, .mem(.src1q), ._, ._ }, |
| | 35646 | .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, |
| | 35647 | .{ ._, ._c, .st, ._, ._, ._, ._ }, |
| | 35648 | .{ ._, ._, .sbb, .dst0q0, .tmp3q, ._, ._ }, |
| | 35649 | .{ ._, ._, .sbb, .dst0q1, .tmp3q, ._, ._ }, |
| | 35650 | } }, |
| | 35651 | }, .{ |
| | 35652 | .required_features = .{ .@"64bit", null, null, null }, |
| | 35653 | .src_constraints = .{ |
| | 35654 | .{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }, |
| | 35655 | .{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }, |
| | 35656 | .any, |
| | 35657 | }, |
| | 35658 | .patterns = &.{ |
| | 35659 | .{ .src = .{ .to_mut_mem, .to_mut_mem, .none } }, |
| | 35660 | }, |
| | 35661 | .call_frame = .{ .alignment = .@"16" }, |
| | 35662 | .extra_temps = .{ |
| | 35663 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| | 35664 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| | 35665 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| | 35666 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| | 35667 | .{ .type = .i32, .kind = .{ .rc = .general_purpose } }, |
| | 35668 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divei4" } } }, |
| | 35669 | .{ .kind = .{ .mem_of_type = .dst0 } }, |
| | 35670 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modei4" } } }, |
| | 35671 | .unused, |
| | 35672 | .unused, |
| | 35673 | .unused, |
| | 35674 | }, |
| | 35675 | .dst_temps = .{ .mem, .unused }, |
| | 35676 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| | 35677 | .each = .{ .once = &.{ |
| | 35678 | .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ }, |
| | 35679 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| | 35680 | .{ ._, ._, .lea, .tmp2p, .mem(.src1), ._, ._ }, |
| | 35681 | .{ ._, ._, .mov, .tmp3d, .sa(.src0, .add_bit_size), ._, ._ }, |
| | 35682 | .{ ._, ._, .mov, .tmp4d, .memad(.src0d, .add_size, -4), ._, ._ }, |
| | 35683 | .{ ._, ._, .xor, .tmp4d, .memad(.src1d, .add_size, -4), ._, ._ }, |
| | 35684 | .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, |
| | 35685 | .{ ._, ._, .@"test", .tmp4d, .tmp4d, ._, ._ }, |
| | 35686 | .{ ._, ._ns, .j, .@"0f", ._, ._, ._ }, |
| | 35687 | .{ ._, ._, .lea, .tmp0p, .mem(.tmp6), ._, ._ }, |
| | 35688 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| | 35689 | .{ ._, ._, .lea, .tmp2p, .mem(.src1), ._, ._ }, |
| | 35690 | .{ ._, ._, .mov, .tmp3d, .sa(.src0, .add_bit_size), ._, ._ }, |
| | 35691 | .{ ._, ._, .call, .tmp7d, ._, ._, ._ }, |
| | 35692 | .{ ._, ._, .mov, .tmp0d, .sia(-8, .dst0, .add_size), ._, ._ }, |
| | 35693 | .{ .@"1:", ._, .cmp, .memi(.tmp6q, .tmp0), .si(0), ._, ._ }, |
| | 35694 | .{ ._, ._e, .j, .@"3f", ._, ._, ._ }, |
| | 35695 | .{ ._, ._, .mov, .tmp0p, .sa(.dst0, .sub_size_div_8), ._, ._ }, |
| | 35696 | .{ .@"2:", ._, .adc, .memsia(.dst0q, .@"8", .tmp0, .add_size), .si(-1), ._, ._ }, |
| | 35697 | .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, |
| | 35698 | .{ ._, ._nz, .j, .@"2b", ._, ._, ._ }, |
| | 35699 | .{ .@"3:", ._, .sub, .tmp0d, .si(8), ._, ._ }, |
| | 35700 | .{ ._, ._ae, .j, .@"1b", ._, ._, ._ }, |
| | 35701 | } }, |
| | 35702 | } }), |
| | 35703 | .unsigned => res[0] = ops[0].divTruncInts(&ops[1], cg) catch |err| break :err err, |
| | 35704 | } else cg.select(&res, &.{ty}, &ops, comptime &.{ .{ |
| 35467 | .required_features = .{ .f16c, null, null, null }, | 35705 | .required_features = .{ .f16c, null, null, null }, |
| 35468 | .src_constraints = .{ | 35706 | .src_constraints = .{ |
| 35469 | .{ .scalar_float = .{ .of = .word, .is = .word } }, | 35707 | .{ .scalar_float = .{ .of = .word, .is = .word } }, |
| ... | @@ -36494,10 +36732,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36494,10 +36732,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36494 | .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, | 36732 | .{ ._, ._, .add, .tmp0p, .si(16), ._, ._ }, |
| 36495 | .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, | 36733 | .{ ._, ._nc, .j, .@"0b", ._, ._, ._ }, |
| 36496 | } }, | 36734 | } }, |
| 36497 | } }) catch |err| switch (err) { | 36735 | } })) catch |err| switch (err) { |
| 36498 | error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ | 36736 | error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ |
| 36499 | @tagName(air_tag), | 36737 | @tagName(air_tag), |
| 36500 | cg.typeOf(bin_op.lhs).fmt(pt), | 36738 | ty.fmt(pt), |
| 36501 | ops[0].tracking(cg), | 36739 | ops[0].tracking(cg), |
| 36502 | ops[1].tracking(cg), | 36740 | ops[1].tracking(cg), |
| 36503 | }), | 36741 | }), |
| ... | @@ -36510,6 +36748,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36510,6 +36748,13 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36510 | var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); | 36748 | var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); |
| 36511 | var res: [1]Temp = undefined; | 36749 | var res: [1]Temp = undefined; |
| 36512 | cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{ | 36750 | cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{ |
| | 36751 | .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any }, |
| | 36752 | .patterns = &.{ |
| | 36753 | .{ .src = .{ .any, .any, .none } }, |
| | 36754 | }, |
| | 36755 | .dst_temps = .{ .{ .imm = 0 }, .unused }, |
| | 36756 | .each = .{ .once = &.{} }, |
| | 36757 | }, .{ |
| 36513 | .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, | 36758 | .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, |
| 36514 | .patterns = &.{ | 36759 | .patterns = &.{ |
| 36515 | .{ .src = .{ .mem, .mem, .none } }, | 36760 | .{ .src = .{ .mem, .mem, .none } }, |
| ... | @@ -36616,8 +36861,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36616,8 +36861,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36616 | .src_constraints = .{ .{ .signed_int = .xword }, .{ .signed_int = .xword }, .any }, | 36861 | .src_constraints = .{ .{ .signed_int = .xword }, .{ .signed_int = .xword }, .any }, |
| 36617 | .patterns = &.{ | 36862 | .patterns = &.{ |
| 36618 | .{ .src = .{ | 36863 | .{ .src = .{ |
| 36619 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 0 } }, | 36864 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 0 } }, |
| 36620 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 2 } }, | 36865 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 2 } }, |
| 36621 | .none, | 36866 | .none, |
| 36622 | } }, | 36867 | } }, |
| 36623 | }, | 36868 | }, |
| ... | @@ -36635,7 +36880,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36635,7 +36880,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36635 | .unused, | 36880 | .unused, |
| 36636 | .unused, | 36881 | .unused, |
| 36637 | }, | 36882 | }, |
| 36638 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .index = 0 } }, .unused }, | 36883 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| 36639 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, | 36884 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| 36640 | .each = .{ .once = &.{ | 36885 | .each = .{ .once = &.{ |
| 36641 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, | 36886 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| ... | @@ -36645,8 +36890,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36645,8 +36890,8 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36645 | .src_constraints = .{ .{ .unsigned_int = .xword }, .{ .unsigned_int = .xword }, .any }, | 36890 | .src_constraints = .{ .{ .unsigned_int = .xword }, .{ .unsigned_int = .xword }, .any }, |
| 36646 | .patterns = &.{ | 36891 | .patterns = &.{ |
| 36647 | .{ .src = .{ | 36892 | .{ .src = .{ |
| 36648 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 0 } }, | 36893 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 0 } }, |
| 36649 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 2 } }, | 36894 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 2 } }, |
| 36650 | .none, | 36895 | .none, |
| 36651 | } }, | 36896 | } }, |
| 36652 | }, | 36897 | }, |
| ... | @@ -36664,7 +36909,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36664,7 +36909,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36664 | .unused, | 36909 | .unused, |
| 36665 | .unused, | 36910 | .unused, |
| 36666 | }, | 36911 | }, |
| 36667 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .index = 0 } }, .unused }, | 36912 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| 36668 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, | 36913 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| 36669 | .each = .{ .once = &.{ | 36914 | .each = .{ .once = &.{ |
| 36670 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, | 36915 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| ... | @@ -36681,10 +36926,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36681,10 +36926,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36681 | }, | 36926 | }, |
| 36682 | .call_frame = .{ .alignment = .@"16" }, | 36927 | .call_frame = .{ .alignment = .@"16" }, |
| 36683 | .extra_temps = .{ | 36928 | .extra_temps = .{ |
| 36684 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 36929 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 36685 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 36930 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 36686 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 36931 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 36687 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 36932 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 36688 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modei4" } } }, | 36933 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modei4" } } }, |
| 36689 | .unused, | 36934 | .unused, |
| 36690 | .unused, | 36935 | .unused, |
| ... | @@ -36714,10 +36959,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -36714,10 +36959,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 36714 | }, | 36959 | }, |
| 36715 | .call_frame = .{ .alignment = .@"16" }, | 36960 | .call_frame = .{ .alignment = .@"16" }, |
| 36716 | .extra_temps = .{ | 36961 | .extra_temps = .{ |
| 36717 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 36962 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 36718 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 36963 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 36719 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 36964 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 36720 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 36965 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 36721 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodei4" } } }, | 36966 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodei4" } } }, |
| 36722 | .unused, | 36967 | .unused, |
| 36723 | .unused, | 36968 | .unused, |
| ... | @@ -37078,12 +37323,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -37078,12 +37323,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 37078 | .call_frame = .{ .alignment = .@"16" }, | 37323 | .call_frame = .{ .alignment = .@"16" }, |
| 37079 | .extra_temps = .{ | 37324 | .extra_temps = .{ |
| 37080 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 37325 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 37081 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 37326 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 37082 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 37327 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 37083 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 37328 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 37084 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 37329 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 37085 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modti3" } } }, | 37330 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modti3" } } }, |
| 37086 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .index = 0 } } }, | 37331 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 37087 | .unused, | 37332 | .unused, |
| 37088 | .unused, | 37333 | .unused, |
| 37089 | .unused, | 37334 | .unused, |
| ... | @@ -37116,12 +37361,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -37116,12 +37361,12 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 37116 | .call_frame = .{ .alignment = .@"16" }, | 37361 | .call_frame = .{ .alignment = .@"16" }, |
| 37117 | .extra_temps = .{ | 37362 | .extra_temps = .{ |
| 37118 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 37363 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 37119 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 37364 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 37120 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 37365 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 37121 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 37366 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 37122 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 37367 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 37123 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodti3" } } }, | 37368 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodti3" } } }, |
| 37124 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .index = 0 } } }, | 37369 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 37125 | .unused, | 37370 | .unused, |
| 37126 | .unused, | 37371 | .unused, |
| 37127 | .unused, | 37372 | .unused, |
| ... | @@ -37154,10 +37399,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -37154,10 +37399,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 37154 | .call_frame = .{ .alignment = .@"16" }, | 37399 | .call_frame = .{ .alignment = .@"16" }, |
| 37155 | .extra_temps = .{ | 37400 | .extra_temps = .{ |
| 37156 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 37401 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 37157 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 37402 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 37158 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 37403 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 37159 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 37404 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 37160 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 37405 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 37161 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modei4" } } }, | 37406 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modei4" } } }, |
| 37162 | .unused, | 37407 | .unused, |
| 37163 | .unused, | 37408 | .unused, |
| ... | @@ -37190,10 +37435,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -37190,10 +37435,10 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 37190 | .call_frame = .{ .alignment = .@"16" }, | 37435 | .call_frame = .{ .alignment = .@"16" }, |
| 37191 | .extra_temps = .{ | 37436 | .extra_temps = .{ |
| 37192 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 37437 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 37193 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 37438 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 37194 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 37439 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 37195 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 37440 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 37196 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 37441 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 37197 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodei4" } } }, | 37442 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodei4" } } }, |
| 37198 | .unused, | 37443 | .unused, |
| 37199 | .unused, | 37444 | .unused, |
| ... | @@ -37987,12 +38232,498 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -37987,12 +38232,498 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 37987 | }; | 38232 | }; |
| 37988 | try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); | 38233 | try res[0].finish(inst, &.{ bin_op.lhs, bin_op.rhs }, &ops, cg); |
| 37989 | }, | 38234 | }, |
| 37990 | .mod, .mod_optimized => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, .mod) else fallback: { | 38235 | .mod, .mod_optimized => |air_tag| if (use_old) try cg.airMulDivBinOp(inst, .mod) else { |
| 37991 | const bin_op = air_datas[@intFromEnum(inst)].bin_op; | 38236 | const bin_op = air_datas[@intFromEnum(inst)].bin_op; |
| 37992 | if (cg.floatBits(cg.typeOf(bin_op.lhs).scalarType(zcu)) == null) break :fallback try cg.airMulDivBinOp(inst, .mod); | | |
| 37993 | var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); | 38237 | var ops = try cg.tempsFromOperands(inst, .{ bin_op.lhs, bin_op.rhs }); |
| 37994 | var res: [1]Temp = undefined; | 38238 | var res: [1]Temp = undefined; |
| 37995 | cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{ | 38239 | cg.select(&res, &.{cg.typeOf(bin_op.lhs)}, &ops, comptime &.{ .{ |
| | 38240 | .src_constraints = .{ .{ .exact_int = 1 }, .{ .exact_int = 1 }, .any }, |
| | 38241 | .patterns = &.{ |
| | 38242 | .{ .src = .{ .any, .any, .none } }, |
| | 38243 | }, |
| | 38244 | .dst_temps = .{ .{ .imm = 0 }, .unused }, |
| | 38245 | .each = .{ .once = &.{} }, |
| | 38246 | }, .{ |
| | 38247 | .required_features = .{ .cmov, null, null, null }, |
| | 38248 | .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, |
| | 38249 | .patterns = &.{ |
| | 38250 | .{ .src = .{ .mem, .to_mut_gphi, .none } }, |
| | 38251 | .{ .src = .{ .to_gpr, .to_mut_gphi, .none } }, |
| | 38252 | }, |
| | 38253 | .extra_temps = .{ |
| | 38254 | .{ .type = .i8, .kind = .{ .rc = .gphi } }, |
| | 38255 | .unused, |
| | 38256 | .unused, |
| | 38257 | .unused, |
| | 38258 | .unused, |
| | 38259 | .unused, |
| | 38260 | .unused, |
| | 38261 | .unused, |
| | 38262 | .unused, |
| | 38263 | .unused, |
| | 38264 | .unused, |
| | 38265 | }, |
| | 38266 | .dst_temps = .{ .{ .reg = .ah }, .unused }, |
| | 38267 | .clobbers = .{ .eflags = true }, |
| | 38268 | .each = .{ .once = &.{ |
| | 38269 | .{ ._, ._, .movsx, .dst0d, .src0b, ._, ._ }, |
| | 38270 | .{ ._, .i_, .div, .src1b, ._, ._, ._ }, |
| | 38271 | .{ ._, ._, .mov, .tmp0d, .dst0d, ._, ._ }, |
| | 38272 | .{ ._, ._, .add, .tmp0h, .src1b, ._, ._ }, |
| | 38273 | .{ ._, ._, .@"and", .src1b, .sa(.src0, .add_smin), ._, ._ }, |
| | 38274 | .{ ._, ._, .xor, .src1b, .dst0h, ._, ._ }, |
| | 38275 | .{ ._, ._, .cmp, .src1b, .sa(.src0, .add_smin), ._, ._ }, |
| | 38276 | .{ ._, ._a, .cmov, .dst0d, .tmp0d, ._, ._ }, |
| | 38277 | } }, |
| | 38278 | }, .{ |
| | 38279 | .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, |
| | 38280 | .patterns = &.{ |
| | 38281 | .{ .src = .{ .mem, .to_gphi, .none } }, |
| | 38282 | .{ .src = .{ .to_gpr, .to_gphi, .none } }, |
| | 38283 | }, |
| | 38284 | .extra_temps = .{ |
| | 38285 | .{ .type = .i8, .kind = .{ .rc = .gphi } }, |
| | 38286 | .unused, |
| | 38287 | .unused, |
| | 38288 | .unused, |
| | 38289 | .unused, |
| | 38290 | .unused, |
| | 38291 | .unused, |
| | 38292 | .unused, |
| | 38293 | .unused, |
| | 38294 | .unused, |
| | 38295 | .unused, |
| | 38296 | }, |
| | 38297 | .dst_temps = .{ .{ .reg = .ah }, .unused }, |
| | 38298 | .clobbers = .{ .eflags = true }, |
| | 38299 | .each = .{ .once = &.{ |
| | 38300 | .{ ._, ._, .movsx, .dst0d, .src0b, ._, ._ }, |
| | 38301 | .{ ._, .i_, .div, .src1b, ._, ._, ._ }, |
| | 38302 | .{ ._, ._, .mov, .tmp0d, .src1d, ._, ._ }, |
| | 38303 | .{ ._, ._, .@"and", .tmp0b, .sa(.src0, .add_smin), ._, ._ }, |
| | 38304 | .{ ._, ._, .xor, .tmp0b, .dst0h, ._, ._ }, |
| | 38305 | .{ ._, ._, .cmp, .tmp0b, .sa(.src0, .add_smin), ._, ._ }, |
| | 38306 | .{ ._, ._na, .j, .@"0f", ._, ._, ._ }, |
| | 38307 | .{ ._, ._, .add, .dst0h, .src1b, ._, ._ }, |
| | 38308 | } }, |
| | 38309 | }, .{ |
| | 38310 | .src_constraints = .{ .{ .unsigned_int = .byte }, .{ .unsigned_int = .byte }, .any }, |
| | 38311 | .patterns = &.{ |
| | 38312 | .{ .src = .{ .mem, .mem, .none } }, |
| | 38313 | .{ .src = .{ .to_gpr, .mem, .none } }, |
| | 38314 | .{ .src = .{ .mem, .to_gpr, .none } }, |
| | 38315 | .{ .src = .{ .to_gpr, .to_gpr, .none } }, |
| | 38316 | }, |
| | 38317 | .dst_temps = .{ .{ .reg = .ah }, .unused }, |
| | 38318 | .clobbers = .{ .eflags = true }, |
| | 38319 | .each = .{ .once = &.{ |
| | 38320 | .{ ._, ._, .movzx, .dst0d, .src0b, ._, ._ }, |
| | 38321 | .{ ._, ._, .div, .src1b, ._, ._, ._ }, |
| | 38322 | } }, |
| | 38323 | }, .{ |
| | 38324 | .required_features = .{ .cmov, .fast_imm16, null, null }, |
| | 38325 | .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, |
| | 38326 | .patterns = &.{ |
| | 38327 | .{ .src = .{ .{ .to_reg = .ax }, .to_mut_gpr, .none } }, |
| | 38328 | }, |
| | 38329 | .dst_temps = .{ .{ .reg = .dx }, .unused }, |
| | 38330 | .clobbers = .{ .eflags = true }, |
| | 38331 | .each = .{ .once = &.{ |
| | 38332 | .{ ._, ._, .cwd, ._, ._, ._, ._ }, |
| | 38333 | .{ ._, .i_, .div, .src1w, ._, ._, ._ }, |
| | 38334 | .{ ._, ._, .mov, .src0d, .dst0d, ._, ._ }, |
| | 38335 | .{ ._, ._, .add, .src0d, .src1d, ._, ._ }, |
| | 38336 | .{ ._, ._, .@"and", .src1w, .sa(.src0, .add_smin), ._, ._ }, |
| | 38337 | .{ ._, ._, .xor, .src1d, .dst0d, ._, ._ }, |
| | 38338 | .{ ._, ._, .cmp, .src1w, .sa(.src0, .add_smin), ._, ._ }, |
| | 38339 | .{ ._, ._a, .cmov, .dst0d, .src0d, ._, ._ }, |
| | 38340 | } }, |
| | 38341 | }, .{ |
| | 38342 | .required_features = .{ .cmov, null, null, null }, |
| | 38343 | .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, |
| | 38344 | .patterns = &.{ |
| | 38345 | .{ .src = .{ .{ .to_reg = .ax }, .to_mut_gpr, .none } }, |
| | 38346 | }, |
| | 38347 | .dst_temps = .{ .{ .reg = .dx }, .unused }, |
| | 38348 | .clobbers = .{ .eflags = true }, |
| | 38349 | .each = .{ .once = &.{ |
| | 38350 | .{ ._, ._, .cwd, ._, ._, ._, ._ }, |
| | 38351 | .{ ._, .i_, .div, .src1w, ._, ._, ._ }, |
| | 38352 | .{ ._, ._, .mov, .src0d, .dst0d, ._, ._ }, |
| | 38353 | .{ ._, ._, .add, .src0d, .src1d, ._, ._ }, |
| | 38354 | .{ ._, ._, .@"and", .src1d, .sa(.src0, .add_smin), ._, ._ }, |
| | 38355 | .{ ._, ._, .xor, .src1d, .dst0d, ._, ._ }, |
| | 38356 | .{ ._, ._, .cmp, .src1w, .sa(.src0, .add_smin), ._, ._ }, |
| | 38357 | .{ ._, ._a, .cmov, .dst0d, .src0d, ._, ._ }, |
| | 38358 | } }, |
| | 38359 | }, .{ |
| | 38360 | .required_features = .{ .fast_imm16, null, null, null }, |
| | 38361 | .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, |
| | 38362 | .patterns = &.{ |
| | 38363 | .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } }, |
| | 38364 | }, |
| | 38365 | .dst_temps = .{ .{ .reg = .dx }, .unused }, |
| | 38366 | .clobbers = .{ .eflags = true }, |
| | 38367 | .each = .{ .once = &.{ |
| | 38368 | .{ ._, ._, .cwd, ._, ._, ._, ._ }, |
| | 38369 | .{ ._, .i_, .div, .src1w, ._, ._, ._ }, |
| | 38370 | .{ ._, ._, .mov, .src0d, .src1d, ._, ._ }, |
| | 38371 | .{ ._, ._, .@"and", .src0w, .sa(.src0, .add_smin), ._, ._ }, |
| | 38372 | .{ ._, ._, .xor, .src0d, .dst0d, ._, ._ }, |
| | 38373 | .{ ._, ._, .cmp, .src0w, .sa(.src0, .add_smin), ._, ._ }, |
| | 38374 | .{ ._, ._na, .j, .@"0f", ._, ._, ._ }, |
| | 38375 | .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, |
| | 38376 | } }, |
| | 38377 | }, .{ |
| | 38378 | .src_constraints = .{ .{ .signed_int = .word }, .{ .signed_int = .word }, .any }, |
| | 38379 | .patterns = &.{ |
| | 38380 | .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } }, |
| | 38381 | }, |
| | 38382 | .dst_temps = .{ .{ .reg = .dx }, .unused }, |
| | 38383 | .clobbers = .{ .eflags = true }, |
| | 38384 | .each = .{ .once = &.{ |
| | 38385 | .{ ._, ._, .cwd, ._, ._, ._, ._ }, |
| | 38386 | .{ ._, .i_, .div, .src1w, ._, ._, ._ }, |
| | 38387 | .{ ._, ._, .mov, .src0d, .src1d, ._, ._ }, |
| | 38388 | .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_smin), ._, ._ }, |
| | 38389 | .{ ._, ._, .xor, .src0d, .dst0d, ._, ._ }, |
| | 38390 | .{ ._, ._, .cmp, .src0w, .sa(.src0, .add_smin), ._, ._ }, |
| | 38391 | .{ ._, ._na, .j, .@"0f", ._, ._, ._ }, |
| | 38392 | .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, |
| | 38393 | } }, |
| | 38394 | }, .{ |
| | 38395 | .src_constraints = .{ .{ .unsigned_int = .word }, .{ .unsigned_int = .word }, .any }, |
| | 38396 | .patterns = &.{ |
| | 38397 | .{ .src = .{ .{ .to_reg = .ax }, .mem, .none } }, |
| | 38398 | .{ .src = .{ .{ .to_reg = .ax }, .to_gpr, .none } }, |
| | 38399 | }, |
| | 38400 | .dst_temps = .{ .{ .reg = .dx }, .unused }, |
| | 38401 | .clobbers = .{ .eflags = true }, |
| | 38402 | .each = .{ .once = &.{ |
| | 38403 | .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, |
| | 38404 | .{ ._, ._, .div, .src1w, ._, ._, ._ }, |
| | 38405 | } }, |
| | 38406 | }, .{ |
| | 38407 | .required_features = .{ .cmov, null, null, null }, |
| | 38408 | .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, |
| | 38409 | .patterns = &.{ |
| | 38410 | .{ .src = .{ .{ .to_reg = .eax }, .to_mut_gpr, .none } }, |
| | 38411 | }, |
| | 38412 | .dst_temps = .{ .{ .reg = .edx }, .unused }, |
| | 38413 | .clobbers = .{ .eflags = true }, |
| | 38414 | .each = .{ .once = &.{ |
| | 38415 | .{ ._, ._, .cdq, ._, ._, ._, ._ }, |
| | 38416 | .{ ._, .i_, .div, .src1d, ._, ._, ._ }, |
| | 38417 | .{ ._, ._, .mov, .src0d, .dst0d, ._, ._ }, |
| | 38418 | .{ ._, ._, .add, .src0d, .src1d, ._, ._ }, |
| | 38419 | .{ ._, ._, .@"and", .src1d, .sa(.src0, .add_smin), ._, ._ }, |
| | 38420 | .{ ._, ._, .xor, .src1d, .dst0d, ._, ._ }, |
| | 38421 | .{ ._, ._, .cmp, .src1d, .sa(.src0, .add_smin), ._, ._ }, |
| | 38422 | .{ ._, ._a, .cmov, .dst0d, .src0d, ._, ._ }, |
| | 38423 | } }, |
| | 38424 | }, .{ |
| | 38425 | .src_constraints = .{ .{ .signed_int = .dword }, .{ .signed_int = .dword }, .any }, |
| | 38426 | .patterns = &.{ |
| | 38427 | .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } }, |
| | 38428 | }, |
| | 38429 | .dst_temps = .{ .{ .reg = .edx }, .unused }, |
| | 38430 | .clobbers = .{ .eflags = true }, |
| | 38431 | .each = .{ .once = &.{ |
| | 38432 | .{ ._, ._, .cdq, ._, ._, ._, ._ }, |
| | 38433 | .{ ._, .i_, .div, .src1d, ._, ._, ._ }, |
| | 38434 | .{ ._, ._, .mov, .src0d, .src1d, ._, ._ }, |
| | 38435 | .{ ._, ._, .@"and", .src0d, .sa(.src0, .add_smin), ._, ._ }, |
| | 38436 | .{ ._, ._, .xor, .src0d, .dst0d, ._, ._ }, |
| | 38437 | .{ ._, ._, .cmp, .src0d, .sa(.src0, .add_smin), ._, ._ }, |
| | 38438 | .{ ._, ._na, .j, .@"0f", ._, ._, ._ }, |
| | 38439 | .{ ._, ._, .add, .dst0d, .src1d, ._, ._ }, |
| | 38440 | } }, |
| | 38441 | }, .{ |
| | 38442 | .src_constraints = .{ .{ .unsigned_int = .dword }, .{ .unsigned_int = .dword }, .any }, |
| | 38443 | .patterns = &.{ |
| | 38444 | .{ .src = .{ .{ .to_reg = .eax }, .mem, .none } }, |
| | 38445 | .{ .src = .{ .{ .to_reg = .eax }, .to_gpr, .none } }, |
| | 38446 | }, |
| | 38447 | .dst_temps = .{ .{ .reg = .edx }, .unused }, |
| | 38448 | .clobbers = .{ .eflags = true }, |
| | 38449 | .each = .{ .once = &.{ |
| | 38450 | .{ ._, ._, .xor, .dst0d, .dst0d, ._, ._ }, |
| | 38451 | .{ ._, ._, .div, .src1d, ._, ._, ._ }, |
| | 38452 | } }, |
| | 38453 | }, .{ |
| | 38454 | .required_features = .{ .@"64bit", .cmov, null, null }, |
| | 38455 | .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, |
| | 38456 | .patterns = &.{ |
| | 38457 | .{ .src = .{ .{ .to_reg = .rax }, .to_mut_gpr, .none } }, |
| | 38458 | }, |
| | 38459 | .extra_temps = .{ |
| | 38460 | .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, |
| | 38461 | .unused, |
| | 38462 | .unused, |
| | 38463 | .unused, |
| | 38464 | .unused, |
| | 38465 | .unused, |
| | 38466 | .unused, |
| | 38467 | .unused, |
| | 38468 | .unused, |
| | 38469 | .unused, |
| | 38470 | .unused, |
| | 38471 | }, |
| | 38472 | .dst_temps = .{ .{ .reg = .rdx }, .unused }, |
| | 38473 | .clobbers = .{ .eflags = true }, |
| | 38474 | .each = .{ .once = &.{ |
| | 38475 | .{ ._, ._, .cqo, ._, ._, ._, ._ }, |
| | 38476 | .{ ._, .i_, .div, .src1q, ._, ._, ._ }, |
| | 38477 | .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smin), ._, ._ }, |
| | 38478 | .{ ._, ._, .mov, .src0q, .dst0q, ._, ._ }, |
| | 38479 | .{ ._, ._, .add, .src0q, .src1q, ._, ._ }, |
| | 38480 | .{ ._, ._, .@"and", .src1q, .tmp0q, ._, ._ }, |
| | 38481 | .{ ._, ._, .xor, .src1q, .dst0q, ._, ._ }, |
| | 38482 | .{ ._, ._, .cmp, .src1q, .tmp0q, ._, ._ }, |
| | 38483 | .{ ._, ._a, .cmov, .dst0q, .src0q, ._, ._ }, |
| | 38484 | } }, |
| | 38485 | }, .{ |
| | 38486 | .required_features = .{ .@"64bit", null, null, null }, |
| | 38487 | .src_constraints = .{ .{ .signed_int = .qword }, .{ .signed_int = .qword }, .any }, |
| | 38488 | .patterns = &.{ |
| | 38489 | .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } }, |
| | 38490 | }, |
| | 38491 | .extra_temps = .{ |
| | 38492 | .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, |
| | 38493 | .unused, |
| | 38494 | .unused, |
| | 38495 | .unused, |
| | 38496 | .unused, |
| | 38497 | .unused, |
| | 38498 | .unused, |
| | 38499 | .unused, |
| | 38500 | .unused, |
| | 38501 | .unused, |
| | 38502 | .unused, |
| | 38503 | }, |
| | 38504 | .dst_temps = .{ .{ .reg = .rdx }, .unused }, |
| | 38505 | .clobbers = .{ .eflags = true }, |
| | 38506 | .each = .{ .once = &.{ |
| | 38507 | .{ ._, ._, .cqo, ._, ._, ._, ._ }, |
| | 38508 | .{ ._, .i_, .div, .src1q, ._, ._, ._ }, |
| | 38509 | .{ ._, ._, .mov, .tmp0q, .ua(.src0, .add_smin), ._, ._ }, |
| | 38510 | .{ ._, ._, .mov, .src0q, .src1q, ._, ._ }, |
| | 38511 | .{ ._, ._, .@"and", .src0q, .tmp0q, ._, ._ }, |
| | 38512 | .{ ._, ._, .xor, .src0q, .dst0q, ._, ._ }, |
| | 38513 | .{ ._, ._, .cmp, .src0q, .tmp0q, ._, ._ }, |
| | 38514 | .{ ._, ._na, .j, .@"0f", ._, ._, ._ }, |
| | 38515 | .{ ._, ._, .add, .dst0q, .src1q, ._, ._ }, |
| | 38516 | } }, |
| | 38517 | }, .{ |
| | 38518 | .required_features = .{ .@"64bit", null, null, null }, |
| | 38519 | .src_constraints = .{ .{ .unsigned_int = .qword }, .{ .unsigned_int = .qword }, .any }, |
| | 38520 | .patterns = &.{ |
| | 38521 | .{ .src = .{ .{ .to_reg = .rax }, .mem, .none } }, |
| | 38522 | .{ .src = .{ .{ .to_reg = .rax }, .to_gpr, .none } }, |
| | 38523 | }, |
| | 38524 | .dst_temps = .{ .{ .reg = .rdx }, .unused }, |
| | 38525 | .clobbers = .{ .eflags = true }, |
| | 38526 | .each = .{ .once = &.{ |
| | 38527 | .{ ._, ._, .xor, .dst0q, .dst0q, ._, ._ }, |
| | 38528 | .{ ._, ._, .div, .src1q, ._, ._, ._ }, |
| | 38529 | } }, |
| | 38530 | }, .{ |
| | 38531 | .required_features = .{ .@"64bit", .cmov, null, null }, |
| | 38532 | .src_constraints = .{ .{ .signed_int = .xword }, .{ .signed_int = .xword }, .any }, |
| | 38533 | .patterns = &.{ |
| | 38534 | .{ .src = .{ .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .to_mem, .none } }, |
| | 38535 | }, |
| | 38536 | .call_frame = .{ .alignment = .@"16" }, |
| | 38537 | .extra_temps = .{ |
| | 38538 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| | 38539 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modti3" } } }, |
| | 38540 | .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, |
| | 38541 | .unused, |
| | 38542 | .unused, |
| | 38543 | .unused, |
| | 38544 | .unused, |
| | 38545 | .unused, |
| | 38546 | .unused, |
| | 38547 | .unused, |
| | 38548 | .unused, |
| | 38549 | }, |
| | 38550 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| | 38551 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| | 38552 | .each = .{ .once = &.{ |
| | 38553 | .{ ._, ._, .mov, .dst0q1, .mem(.src1q), ._, ._ }, |
| | 38554 | .{ ._, ._, .mov, .tmp0q, .memd(.src1q, 8), ._, ._ }, |
| | 38555 | .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, |
| | 38556 | .{ ._, ._, .mov, .src0q0, .memd(.src1q, 8), ._, ._ }, |
| | 38557 | .{ ._, ._, .mov, .src0q1, .ua(.src0, .add_smin), ._, ._ }, |
| | 38558 | .{ ._, ._, .mov, .tmp0q, .src0q0, ._, ._ }, |
| | 38559 | .{ ._, ._, .@"and", .tmp0q, .src0q1, ._, ._ }, |
| | 38560 | .{ ._, ._, .xor, .tmp0q, .dst0q1, ._, ._ }, |
| | 38561 | .{ ._, ._, .xor, .tmp2d, .tmp2d, ._, ._ }, |
| | 38562 | .{ ._, ._, .cmp, .dst0q0, .si(1), ._, ._ }, |
| | 38563 | .{ ._, ._, .sbb, .tmp0q, .src0q1, ._, ._ }, |
| | 38564 | .{ ._, ._nae, .cmov, .src0q0, .tmp2q, ._, ._ }, |
| | 38565 | .{ ._, ._ae, .cmov, .tmp2q, .mem(.src1q), ._, ._ }, |
| | 38566 | .{ ._, ._, .add, .dst0q0, .tmp2q, ._, ._ }, |
| | 38567 | .{ ._, ._, .adc, .dst0q1, .src0q0, ._, ._ }, |
| | 38568 | } }, |
| | 38569 | }, .{ |
| | 38570 | .required_features = .{ .@"64bit", null, null, null }, |
| | 38571 | .src_constraints = .{ .{ .signed_int = .xword }, .{ .signed_int = .xword }, .any }, |
| | 38572 | .patterns = &.{ |
| | 38573 | .{ .src = .{ .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .to_mem, .none } }, |
| | 38574 | }, |
| | 38575 | .call_frame = .{ .alignment = .@"16" }, |
| | 38576 | .extra_temps = .{ |
| | 38577 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| | 38578 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modti3" } } }, |
| | 38579 | .unused, |
| | 38580 | .unused, |
| | 38581 | .unused, |
| | 38582 | .unused, |
| | 38583 | .unused, |
| | 38584 | .unused, |
| | 38585 | .unused, |
| | 38586 | .unused, |
| | 38587 | .unused, |
| | 38588 | }, |
| | 38589 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| | 38590 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| | 38591 | .each = .{ .once = &.{ |
| | 38592 | .{ ._, ._, .mov, .dst0q1, .mem(.src1q), ._, ._ }, |
| | 38593 | .{ ._, ._, .mov, .tmp0q, .memd(.src1q, 8), ._, ._ }, |
| | 38594 | .{ ._, ._, .call, .tmp1d, ._, ._, ._ }, |
| | 38595 | .{ ._, ._, .mov, .src0q0, .memd(.src1q, 8), ._, ._ }, |
| | 38596 | .{ ._, ._, .mov, .src0q1, .ua(.src0, .add_smin), ._, ._ }, |
| | 38597 | .{ ._, ._, .mov, .tmp0q, .src0q0, ._, ._ }, |
| | 38598 | .{ ._, ._, .@"and", .tmp0q, .src0q1, ._, ._ }, |
| | 38599 | .{ ._, ._, .xor, .tmp0q, .dst0q1, ._, ._ }, |
| | 38600 | .{ ._, ._, .cmp, .dst0q0, .si(1), ._, ._ }, |
| | 38601 | .{ ._, ._, .sbb, .tmp0q, .src0q1, ._, ._ }, |
| | 38602 | .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, |
| | 38603 | .{ ._, ._, .add, .dst0q0, .mem(.src1q), ._, ._ }, |
| | 38604 | .{ ._, ._, .adc, .dst0q1, .src0q0, ._, ._ }, |
| | 38605 | } }, |
| | 38606 | }, .{ |
| | 38607 | .required_features = .{ .@"64bit", null, null, null }, |
| | 38608 | .src_constraints = .{ .{ .unsigned_int = .xword }, .{ .unsigned_int = .xword }, .any }, |
| | 38609 | .patterns = &.{ |
| | 38610 | .{ .src = .{ |
| | 38611 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 0 } }, |
| | 38612 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 2 } }, |
| | 38613 | .none, |
| | 38614 | } }, |
| | 38615 | }, |
| | 38616 | .call_frame = .{ .alignment = .@"16" }, |
| | 38617 | .extra_temps = .{ |
| | 38618 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodti3" } } }, |
| | 38619 | .unused, |
| | 38620 | .unused, |
| | 38621 | .unused, |
| | 38622 | .unused, |
| | 38623 | .unused, |
| | 38624 | .unused, |
| | 38625 | .unused, |
| | 38626 | .unused, |
| | 38627 | .unused, |
| | 38628 | .unused, |
| | 38629 | }, |
| | 38630 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| | 38631 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| | 38632 | .each = .{ .once = &.{ |
| | 38633 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| | 38634 | } }, |
| | 38635 | }, .{ |
| | 38636 | .required_features = .{ .@"64bit", null, null, null }, |
| | 38637 | .src_constraints = .{ |
| | 38638 | .{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }, |
| | 38639 | .{ .remainder_signed_int = .{ .of = .dword, .is = .dword } }, |
| | 38640 | .any, |
| | 38641 | }, |
| | 38642 | .patterns = &.{ |
| | 38643 | .{ .src = .{ .to_mut_mem, .to_mut_mem, .none } }, |
| | 38644 | }, |
| | 38645 | .call_frame = .{ .alignment = .@"16" }, |
| | 38646 | .extra_temps = .{ |
| | 38647 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| | 38648 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| | 38649 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| | 38650 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| | 38651 | .{ .type = .i64, .kind = .{ .rc = .general_purpose } }, |
| | 38652 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__modei4" } } }, |
| | 38653 | .unused, |
| | 38654 | .unused, |
| | 38655 | .unused, |
| | 38656 | .unused, |
| | 38657 | .unused, |
| | 38658 | }, |
| | 38659 | .dst_temps = .{ .mem, .unused }, |
| | 38660 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| | 38661 | .each = .{ .once = &.{ |
| | 38662 | .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ }, |
| | 38663 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| | 38664 | .{ ._, ._, .lea, .tmp2p, .mem(.src1), ._, ._ }, |
| | 38665 | .{ ._, ._, .mov, .tmp3d, .sa(.src0, .add_bit_size), ._, ._ }, |
| | 38666 | .{ ._, ._, .mov, .tmp4q, .memad(.src1q, .add_size, -8), ._, ._ }, |
| | 38667 | .{ ._, ._, .call, .tmp5d, ._, ._, ._ }, |
| | 38668 | .{ ._, ._, .mov, .tmp0d, .sia(-3, .dst0, .add_size_div_8), ._, ._ }, |
| | 38669 | .{ ._, ._, .mov, .tmp1q, .ua(.src0, .add_smin), ._, ._ }, |
| | 38670 | .{ ._, ._, .mov, .tmp2q, .tmp4q, ._, ._ }, |
| | 38671 | .{ ._, ._, .@"and", .tmp2q, .tmp1q, ._, ._ }, |
| | 38672 | .{ ._, ._, .xor, .tmp2q, .memad(.dst0q, .add_size, -8), ._, ._ }, |
| | 38673 | .{ ._, ._, .cmp, .memad(.dst0q, .add_size, -16), .si(1), ._, ._ }, |
| | 38674 | .{ .@"0:", ._, .mov, .tmp3q, .memsi(.dst0q, .@"8", .tmp0), ._, ._ }, |
| | 38675 | .{ ._, ._, .sbb, .tmp3q, .si(0), ._, ._ }, |
| | 38676 | .{ ._, ._c, .de, .tmp0d, ._, ._, ._ }, |
| | 38677 | .{ ._, ._ns, .j, .@"0b", ._, ._, ._ }, |
| | 38678 | .{ ._, ._, .sbb, .tmp2q, .tmp1q, ._, ._ }, |
| | 38679 | .{ ._, ._nae, .j, .@"0f", ._, ._, ._ }, |
| | 38680 | .{ ._, ._, .mov, .tmp0p, .sa(.src1, .sub_size_div_8), ._, ._ }, |
| | 38681 | .{ ._, ._, .@"test", .tmp4q, .tmp4q, ._, ._ }, |
| | 38682 | .{ ._, ._ns, .j, .@"2f", ._, ._, ._ }, |
| | 38683 | .{ .@"1:", ._, .mov, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ }, |
| | 38684 | .{ ._, ._, .sbb, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp1q, ._, ._ }, |
| | 38685 | .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, |
| | 38686 | .{ ._, ._nz, .j, .@"1b", ._, ._, ._ }, |
| | 38687 | .{ ._, ._mp, .j, .@"0f", ._, ._, ._ }, |
| | 38688 | .{ .@"2:", ._, .mov, .tmp1q, .memsia(.src1q, .@"8", .tmp0, .add_size), ._, ._ }, |
| | 38689 | .{ ._, ._, .adc, .memsia(.dst0q, .@"8", .tmp0, .add_size), .tmp1q, ._, ._ }, |
| | 38690 | .{ ._, ._c, .in, .tmp0p, ._, ._, ._ }, |
| | 38691 | .{ ._, ._nz, .j, .@"2b", ._, ._, ._ }, |
| | 38692 | } }, |
| | 38693 | }, .{ |
| | 38694 | .required_features = .{ .@"64bit", null, null, null }, |
| | 38695 | .src_constraints = .{ |
| | 38696 | .{ .remainder_unsigned_int = .{ .of = .dword, .is = .dword } }, |
| | 38697 | .{ .remainder_unsigned_int = .{ .of = .dword, .is = .dword } }, |
| | 38698 | .any, |
| | 38699 | }, |
| | 38700 | .patterns = &.{ |
| | 38701 | .{ .src = .{ .to_mem, .to_mem, .none } }, |
| | 38702 | }, |
| | 38703 | .call_frame = .{ .alignment = .@"16" }, |
| | 38704 | .extra_temps = .{ |
| | 38705 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| | 38706 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| | 38707 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| | 38708 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| | 38709 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__umodei4" } } }, |
| | 38710 | .unused, |
| | 38711 | .unused, |
| | 38712 | .unused, |
| | 38713 | .unused, |
| | 38714 | .unused, |
| | 38715 | .unused, |
| | 38716 | }, |
| | 38717 | .dst_temps = .{ .mem, .unused }, |
| | 38718 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| | 38719 | .each = .{ .once = &.{ |
| | 38720 | .{ ._, ._, .lea, .tmp0p, .mem(.dst0), ._, ._ }, |
| | 38721 | .{ ._, ._, .lea, .tmp1p, .mem(.src0), ._, ._ }, |
| | 38722 | .{ ._, ._, .lea, .tmp2p, .mem(.src1), ._, ._ }, |
| | 38723 | .{ ._, ._, .mov, .tmp3d, .sa(.src0, .add_bit_size), ._, ._ }, |
| | 38724 | .{ ._, ._, .call, .tmp4d, ._, ._, ._ }, |
| | 38725 | } }, |
| | 38726 | }, .{ |
| 37996 | .required_features = .{ .f16c, .fast_imm16, null, null }, | 38727 | .required_features = .{ .f16c, .fast_imm16, null, null }, |
| 37997 | .src_constraints = .{ | 38728 | .src_constraints = .{ |
| 37998 | .{ .scalar_float = .{ .of = .word, .is = .word } }, | 38729 | .{ .scalar_float = .{ .of = .word, .is = .word } }, |
| ... | @@ -160281,9 +161012,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160281,9 +161012,9 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160281 | inline .memcpy, .memmove => |symbol| comptime &.{.{ | 161012 | inline .memcpy, .memmove => |symbol| comptime &.{.{ |
| 160282 | .patterns = &.{ | 161013 | .patterns = &.{ |
| 160283 | .{ .src = .{ | 161014 | .{ .src = .{ |
| 160284 | .{ .to_param_gpr = .{ .cc = .ccc, .index = 0 } }, | 161015 | .{ .to_param_gpr = .{ .cc = .ccc, .at = 0 } }, |
| 160285 | .{ .to_param_gpr = .{ .cc = .ccc, .index = 1 } }, | 161016 | .{ .to_param_gpr = .{ .cc = .ccc, .at = 1 } }, |
| 160286 | .{ .to_param_gpr = .{ .cc = .ccc, .index = 2 } }, | 161017 | .{ .to_param_gpr = .{ .cc = .ccc, .at = 2 } }, |
| 160287 | } }, | 161018 | } }, |
| 160288 | }, | 161019 | }, |
| 160289 | .call_frame = .{ .alignment = .@"16" }, | 161020 | .call_frame = .{ .alignment = .@"16" }, |
| ... | @@ -160333,7 +161064,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160333,7 +161064,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160333 | .required_features = .{ .avx, null, null, null }, | 161064 | .required_features = .{ .avx, null, null, null }, |
| 160334 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161065 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160335 | .patterns = &.{ | 161066 | .patterns = &.{ |
| 160336 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161067 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160337 | }, | 161068 | }, |
| 160338 | .call_frame = .{ .alignment = .@"32" }, | 161069 | .call_frame = .{ .alignment = .@"32" }, |
| 160339 | .extra_temps = .{ | 161070 | .extra_temps = .{ |
| ... | @@ -160359,7 +161090,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160359,7 +161090,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160359 | .required_features = .{ .sse, null, null, null }, | 161090 | .required_features = .{ .sse, null, null, null }, |
| 160360 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161091 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160361 | .patterns = &.{ | 161092 | .patterns = &.{ |
| 160362 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161093 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160363 | }, | 161094 | }, |
| 160364 | .call_frame = .{ .alignment = .@"16" }, | 161095 | .call_frame = .{ .alignment = .@"16" }, |
| 160365 | .extra_temps = .{ | 161096 | .extra_temps = .{ |
| ... | @@ -160384,7 +161115,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160384,7 +161115,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160384 | }, .{ | 161115 | }, .{ |
| 160385 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161116 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160386 | .patterns = &.{ | 161117 | .patterns = &.{ |
| 160387 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161118 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160388 | }, | 161119 | }, |
| 160389 | .call_frame = .{ .alignment = .@"8" }, | 161120 | .call_frame = .{ .alignment = .@"8" }, |
| 160390 | .extra_temps = .{ | 161121 | .extra_temps = .{ |
| ... | @@ -160424,7 +161155,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160424,7 +161155,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160424 | .required_features = .{ .avx, null, null, null }, | 161155 | .required_features = .{ .avx, null, null, null }, |
| 160425 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161156 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160426 | .patterns = &.{ | 161157 | .patterns = &.{ |
| 160427 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161158 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160428 | }, | 161159 | }, |
| 160429 | .call_frame = .{ .alignment = .@"32" }, | 161160 | .call_frame = .{ .alignment = .@"32" }, |
| 160430 | .extra_temps = .{ | 161161 | .extra_temps = .{ |
| ... | @@ -160440,7 +161171,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160440,7 +161171,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160440 | .unused, | 161171 | .unused, |
| 160441 | .unused, | 161172 | .unused, |
| 160442 | }, | 161173 | }, |
| 160443 | .dst_temps = .{ .{ .ret_gpr = .{ .cc = .zigcc, .index = 1 } }, .unused }, | 161174 | .dst_temps = .{ .{ .ret_gpr = .{ .cc = .zigcc, .at = 1 } }, .unused }, |
| 160444 | .clobbers = .{ .eflags = true, .caller_preserved = .zigcc }, | 161175 | .clobbers = .{ .eflags = true, .caller_preserved = .zigcc }, |
| 160445 | .each = .{ .once = &.{ | 161176 | .each = .{ .once = &.{ |
| 160446 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, | 161177 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| ... | @@ -160449,7 +161180,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160449,7 +161180,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160449 | .required_features = .{ .sse, null, null, null }, | 161180 | .required_features = .{ .sse, null, null, null }, |
| 160450 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161181 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160451 | .patterns = &.{ | 161182 | .patterns = &.{ |
| 160452 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161183 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160453 | }, | 161184 | }, |
| 160454 | .call_frame = .{ .alignment = .@"16" }, | 161185 | .call_frame = .{ .alignment = .@"16" }, |
| 160455 | .extra_temps = .{ | 161186 | .extra_temps = .{ |
| ... | @@ -160465,7 +161196,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160465,7 +161196,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160465 | .unused, | 161196 | .unused, |
| 160466 | .unused, | 161197 | .unused, |
| 160467 | }, | 161198 | }, |
| 160468 | .dst_temps = .{ .{ .ret_gpr = .{ .cc = .zigcc, .index = 1 } }, .unused }, | 161199 | .dst_temps = .{ .{ .ret_gpr = .{ .cc = .zigcc, .at = 1 } }, .unused }, |
| 160469 | .clobbers = .{ .eflags = true, .caller_preserved = .zigcc }, | 161200 | .clobbers = .{ .eflags = true, .caller_preserved = .zigcc }, |
| 160470 | .each = .{ .once = &.{ | 161201 | .each = .{ .once = &.{ |
| 160471 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, | 161202 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| ... | @@ -160473,7 +161204,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160473,7 +161204,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160473 | }, .{ | 161204 | }, .{ |
| 160474 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161205 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160475 | .patterns = &.{ | 161206 | .patterns = &.{ |
| 160476 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161207 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160477 | }, | 161208 | }, |
| 160478 | .call_frame = .{ .alignment = .@"8" }, | 161209 | .call_frame = .{ .alignment = .@"8" }, |
| 160479 | .extra_temps = .{ | 161210 | .extra_temps = .{ |
| ... | @@ -160489,7 +161220,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160489,7 +161220,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160489 | .unused, | 161220 | .unused, |
| 160490 | .unused, | 161221 | .unused, |
| 160491 | }, | 161222 | }, |
| 160492 | .dst_temps = .{ .{ .ret_gpr = .{ .cc = .zigcc, .index = 1 } }, .unused }, | 161223 | .dst_temps = .{ .{ .ret_gpr = .{ .cc = .zigcc, .at = 1 } }, .unused }, |
| 160493 | .clobbers = .{ .eflags = true, .caller_preserved = .zigcc }, | 161224 | .clobbers = .{ .eflags = true, .caller_preserved = .zigcc }, |
| 160494 | .each = .{ .once = &.{ | 161225 | .each = .{ .once = &.{ |
| 160495 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, | 161226 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| ... | @@ -160621,7 +161352,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160621,7 +161352,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160621 | .required_features = .{ .avx, null, null, null }, | 161352 | .required_features = .{ .avx, null, null, null }, |
| 160622 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161353 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160623 | .patterns = &.{ | 161354 | .patterns = &.{ |
| 160624 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161355 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160625 | }, | 161356 | }, |
| 160626 | .call_frame = .{ .alignment = .@"32" }, | 161357 | .call_frame = .{ .alignment = .@"32" }, |
| 160627 | .extra_temps = .{ | 161358 | .extra_temps = .{ |
| ... | @@ -160647,7 +161378,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160647,7 +161378,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160647 | .required_features = .{ .sse, null, null, null }, | 161378 | .required_features = .{ .sse, null, null, null }, |
| 160648 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161379 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160649 | .patterns = &.{ | 161380 | .patterns = &.{ |
| 160650 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161381 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160651 | }, | 161382 | }, |
| 160652 | .call_frame = .{ .alignment = .@"16" }, | 161383 | .call_frame = .{ .alignment = .@"16" }, |
| 160653 | .extra_temps = .{ | 161384 | .extra_temps = .{ |
| ... | @@ -160672,7 +161403,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -160672,7 +161403,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { |
| 160672 | }, .{ | 161403 | }, .{ |
| 160673 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, | 161404 | .src_constraints = .{ .{ .int = .gpr }, .any, .any }, |
| 160674 | .patterns = &.{ | 161405 | .patterns = &.{ |
| 160675 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .index = 0 } }, .none, .none } }, | 161406 | .{ .src = .{ .{ .to_param_gpr = .{ .cc = .zigcc, .at = 0 } }, .none, .none } }, |
| 160676 | }, | 161407 | }, |
| 160677 | .call_frame = .{ .alignment = .@"8" }, | 161408 | .call_frame = .{ .alignment = .@"8" }, |
| 160678 | .extra_temps = .{ | 161409 | .extra_temps = .{ |
| ... | @@ -162921,7 +163652,7 @@ fn getValueIfFree(self: *CodeGen, value: MCValue, inst: ?Air.Inst.Index) void { | ... | @@ -162921,7 +163652,7 @@ fn getValueIfFree(self: *CodeGen, value: MCValue, inst: ?Air.Inst.Index) void { |
| 162921 | | 163652 | |
| 162922 | fn freeReg(self: *CodeGen, reg: Register) !void { | 163653 | fn freeReg(self: *CodeGen, reg: Register) !void { |
| 162923 | self.register_manager.freeReg(reg); | 163654 | self.register_manager.freeReg(reg); |
| 162924 | if (reg.class() == .x87) try self.asmRegister(.{ .f_, .free }, reg); | 163655 | if (reg.isClass(.x87)) try self.asmRegister(.{ .f_, .free }, reg); |
| 162925 | } | 163656 | } |
| 162926 | | 163657 | |
| 162927 | fn freeValue(self: *CodeGen, value: MCValue) !void { | 163658 | fn freeValue(self: *CodeGen, value: MCValue) !void { |
| ... | @@ -163840,7 +164571,7 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void { | ... | @@ -163840,7 +164571,7 @@ fn airIntCast(self: *CodeGen, inst: Air.Inst.Index) !void { |
| 163840 | else => src_int_info.bits, | 164571 | else => src_int_info.bits, |
| 163841 | }; | 164572 | }; |
| 163842 | | 164573 | |
| 163843 | const dst_mcv = if ((if (src_mcv.getReg()) |src_reg| src_reg.class() == .general_purpose else src_abi_size > 8) and | 164574 | const dst_mcv = if ((if (src_mcv.getReg()) |src_reg| src_reg.isClass(.general_purpose) else src_abi_size > 8) and |
| 163844 | dst_int_info.bits <= src_storage_bits and | 164575 | dst_int_info.bits <= src_storage_bits and |
| 163845 | std.math.divCeil(u16, dst_int_info.bits, 64) catch unreachable == | 164576 | std.math.divCeil(u16, dst_int_info.bits, 64) catch unreachable == |
| 163846 | std.math.divCeil(u32, src_storage_bits, 64) catch unreachable and | 164577 | std.math.divCeil(u32, src_storage_bits, 64) catch unreachable and |
| ... | @@ -163921,7 +164652,7 @@ fn airTrunc(self: *CodeGen, inst: Air.Inst.Index) !void { | ... | @@ -163921,7 +164652,7 @@ fn airTrunc(self: *CodeGen, inst: Air.Inst.Index) !void { |
| 163921 | if (src_mcv.getReg()) |reg| self.register_manager.lockRegAssumeUnused(reg) else null; | 164652 | if (src_mcv.getReg()) |reg| self.register_manager.lockRegAssumeUnused(reg) else null; |
| 163922 | defer if (src_lock) |lock| self.register_manager.unlockReg(lock); | 164653 | defer if (src_lock) |lock| self.register_manager.unlockReg(lock); |
| 163923 | | 164654 | |
| 163924 | const dst_mcv = if (src_mcv.isRegister() and src_mcv.getReg().?.class() == self.regClassForType(dst_ty) and | 164655 | const dst_mcv = if (src_mcv.isRegister() and src_mcv.getReg().?.isClass(self.regClassForType(dst_ty)) and |
| 163925 | self.reuseOperand(inst, ty_op.operand, 0, src_mcv)) | 164656 | self.reuseOperand(inst, ty_op.operand, 0, src_mcv)) |
| 163926 | src_mcv | 164657 | src_mcv |
| 163927 | else if (dst_abi_size <= 8) | 164658 | else if (dst_abi_size <= 8) |
| ... | @@ -176332,7 +177063,11 @@ fn genSetReg( | ... | @@ -176332,7 +177063,11 @@ fn genSetReg( |
| 176332 | ), | 177063 | ), |
| 176333 | }, | 177064 | }, |
| 176334 | .ip, .cr, .dr => unreachable, | 177065 | .ip, .cr, .dr => unreachable, |
| 176335 | }, | 177066 | } else if ((dst_reg.class() == .gphi) != (src_reg.class() == .gphi)) try self.asmRegisterRegister( |
| | 177067 | .{ ._, .mov }, |
| | 177068 | dst_reg.to8(), |
| | 177069 | src_reg.to8(), |
| | 177070 | ), |
| 176336 | inline .register_pair, | 177071 | inline .register_pair, |
| 176337 | .register_triple, | 177072 | .register_triple, |
| 176338 | .register_quadruple, | 177073 | .register_quadruple, |
| ... | @@ -176452,7 +177187,7 @@ fn genSetReg( | ... | @@ -176452,7 +177187,7 @@ fn genSetReg( |
| 176452 | }); | 177187 | }); |
| 176453 | }, | 177188 | }, |
| 176454 | .register_mask => |src_reg_mask| { | 177189 | .register_mask => |src_reg_mask| { |
| 176455 | assert(src_reg_mask.reg.class() == .sse); | 177190 | assert(src_reg_mask.reg.isClass(.sse)); |
| 176456 | const has_avx = self.hasFeature(.avx); | 177191 | const has_avx = self.hasFeature(.avx); |
| 176457 | const bits_reg = switch (dst_reg.class()) { | 177192 | const bits_reg = switch (dst_reg.class()) { |
| 176458 | .general_purpose => dst_reg, | 177193 | .general_purpose => dst_reg, |
| ... | @@ -177055,7 +177790,7 @@ fn airBitCast(self: *CodeGen, inst: Air.Inst.Index) !void { | ... | @@ -177055,7 +177790,7 @@ fn airBitCast(self: *CodeGen, inst: Air.Inst.Index) !void { |
| 177055 | defer if (src_lock) |lock| self.register_manager.unlockReg(lock); | 177790 | defer if (src_lock) |lock| self.register_manager.unlockReg(lock); |
| 177056 | | 177791 | |
| 177057 | const dst_mcv = if (src_mcv != .register_mask and | 177792 | const dst_mcv = if (src_mcv != .register_mask and |
| 177058 | (if (src_mcv.getReg()) |src_reg| src_reg.class() == .general_purpose else true) and | 177793 | (if (src_mcv.getReg()) |src_reg| src_reg.isClass(.general_purpose) else true) and |
| 177059 | dst_rc.supersetOf(src_rc) and dst_ty.abiSize(zcu) <= src_ty.abiSize(zcu) and | 177794 | dst_rc.supersetOf(src_rc) and dst_ty.abiSize(zcu) <= src_ty.abiSize(zcu) and |
| 177060 | dst_ty.abiAlignment(zcu).order(src_ty.abiAlignment(zcu)).compare(.lte) and | 177795 | dst_ty.abiAlignment(zcu).order(src_ty.abiAlignment(zcu)).compare(.lte) and |
| 177061 | self.reuseOperand(inst, ty_op.operand, 0, src_mcv)) src_mcv else dst: { | 177796 | self.reuseOperand(inst, ty_op.operand, 0, src_mcv)) src_mcv else dst: { |
| ... | @@ -179909,7 +180644,7 @@ fn airReduce(self: *CodeGen, inst: Air.Inst.Index) !void { | ... | @@ -179909,7 +180644,7 @@ fn airReduce(self: *CodeGen, inst: Air.Inst.Index) !void { |
| 179909 | const operand_reg = registerAlias(operand_reg: { | 180644 | const operand_reg = registerAlias(operand_reg: { |
| 179910 | if (operand_mcv.isRegister()) { | 180645 | if (operand_mcv.isRegister()) { |
| 179911 | const operand_reg = operand_mcv.getReg().?; | 180646 | const operand_reg = operand_mcv.getReg().?; |
| 179912 | if (operand_reg.class() == .general_purpose) break :operand_reg operand_reg; | 180647 | if (operand_reg.isClass(.general_purpose)) break :operand_reg operand_reg; |
| 179913 | } | 180648 | } |
| 179914 | break :operand_reg try self.copyToTmpRegister(operand_ty, operand_mcv); | 180649 | break :operand_reg try self.copyToTmpRegister(operand_ty, operand_mcv); |
| 179915 | }, abi_size); | 180650 | }, abi_size); |
| ... | @@ -180779,12 +181514,12 @@ fn resolveCallingConventionValues( | ... | @@ -180779,12 +181514,12 @@ fn resolveCallingConventionValues( |
| 180779 | ret_tracking_i += 1; | 181514 | ret_tracking_i += 1; |
| 180780 | } | 181515 | } |
| 180781 | }, | 181516 | }, |
| 180782 | .sseup => assert(ret_tracking[ret_tracking_i - 1].short.register.class() == .sse), | 181517 | .sseup => assert(ret_tracking[ret_tracking_i - 1].short.register.isClass(.sse)), |
| 180783 | .x87 => { | 181518 | .x87 => { |
| 180784 | ret_tracking[ret_tracking_i] = .init(.{ .register = abi.getCAbiX87ReturnRegs(cc)[0] }); | 181519 | ret_tracking[ret_tracking_i] = .init(.{ .register = abi.getCAbiX87ReturnRegs(cc)[0] }); |
| 180785 | ret_tracking_i += 1; | 181520 | ret_tracking_i += 1; |
| 180786 | }, | 181521 | }, |
| 180787 | .x87up => assert(ret_tracking[ret_tracking_i - 1].short.register.class() == .x87), | 181522 | .x87up => assert(ret_tracking[ret_tracking_i - 1].short.register.isClass(.x87)), |
| 180788 | .complex_x87 => { | 181523 | .complex_x87 => { |
| 180789 | ret_tracking[ret_tracking_i] = .init(.{ .register_pair = abi.getCAbiX87ReturnRegs(cc)[0..2].* }); | 181524 | ret_tracking[ret_tracking_i] = .init(.{ .register_pair = abi.getCAbiX87ReturnRegs(cc)[0..2].* }); |
| 180790 | ret_tracking_i += 1; | 181525 | ret_tracking_i += 1; |
| ... | @@ -180871,7 +181606,7 @@ fn resolveCallingConventionValues( | ... | @@ -180871,7 +181606,7 @@ fn resolveCallingConventionValues( |
| 180871 | arg_mcv_i += 1; | 181606 | arg_mcv_i += 1; |
| 180872 | } | 181607 | } |
| 180873 | }, | 181608 | }, |
| 180874 | .sseup => assert(arg_mcv[arg_mcv_i - 1].register.class() == .sse), | 181609 | .sseup => assert(arg_mcv[arg_mcv_i - 1].register.isClass(.sse)), |
| 180875 | .x87, .x87up, .complex_x87, .memory, .win_i128 => switch (cc) { | 181610 | .x87, .x87up, .complex_x87, .memory, .win_i128 => switch (cc) { |
| 180876 | .x86_64_sysv => switch (class) { | 181611 | .x86_64_sysv => switch (class) { |
| 180877 | .x87, .x87up, .complex_x87, .memory => break, | 181612 | .x87, .x87up, .complex_x87, .memory => break, |
| ... | @@ -181864,8 +182599,8 @@ const Temp = struct { | ... | @@ -181864,8 +182599,8 @@ const Temp = struct { |
| 181864 | const val = temp.tracking(cg).short; | 182599 | const val = temp.tracking(cg).short; |
| 181865 | if (!mut or temp.isMut(cg)) switch (val) { | 182600 | if (!mut or temp.isMut(cg)) switch (val) { |
| 181866 | else => {}, | 182601 | else => {}, |
| 181867 | .register => |reg| if (reg.class() == rc) return false, | 182602 | .register => |reg| if (reg.isClass(rc)) return false, |
| 181868 | .register_offset => |reg_off| if (reg_off.reg.class() == rc and reg_off.off == 0) return false, | 182603 | .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.isClass(rc)) return false, |
| 181869 | }; | 182604 | }; |
| 181870 | const ty = temp.typeOf(cg); | 182605 | const ty = temp.typeOf(cg); |
| 181871 | const new_temp_index = cg.next_temp_index; | 182606 | const new_temp_index = cg.next_temp_index; |
| ... | @@ -185888,6 +186623,21 @@ const Temp = struct { | ... | @@ -185888,6 +186623,21 @@ const Temp = struct { |
| 185888 | var ops: [2]Temp = .{ lhs.*, rhs.* }; | 186623 | var ops: [2]Temp = .{ lhs.*, rhs.* }; |
| 185889 | var res: [1]Temp = undefined; | 186624 | var res: [1]Temp = undefined; |
| 185890 | try cg.select(&res, &.{lhs.typeOf(cg)}, &ops, comptime &.{ .{ | 186625 | try cg.select(&res, &.{lhs.typeOf(cg)}, &ops, comptime &.{ .{ |
| | 186626 | .src_constraints = .{ .{ .exact_signed_int = 1 }, .{ .exact_signed_int = 1 }, .any }, |
| | 186627 | .patterns = &.{ |
| | 186628 | .{ .src = .{ .any, .any, .none } }, |
| | 186629 | }, |
| | 186630 | .dst_temps = .{ .{ .imm = 0 }, .unused }, |
| | 186631 | .each = .{ .once = &.{} }, |
| | 186632 | }, .{ |
| | 186633 | .src_constraints = .{ .{ .exact_unsigned_int = 1 }, .{ .exact_unsigned_int = 1 }, .any }, |
| | 186634 | .patterns = &.{ |
| | 186635 | .{ .src = .{ .mut_mem, .any, .none } }, |
| | 186636 | .{ .src = .{ .to_mut_gpr, .any, .none } }, |
| | 186637 | }, |
| | 186638 | .dst_temps = .{ .{ .ref = .src0 }, .unused }, |
| | 186639 | .each = .{ .once = &.{} }, |
| | 186640 | }, .{ |
| 185891 | .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, | 186641 | .src_constraints = .{ .{ .signed_int = .byte }, .{ .signed_int = .byte }, .any }, |
| 185892 | .patterns = &.{ | 186642 | .patterns = &.{ |
| 185893 | .{ .src = .{ .mem, .mem, .none } }, | 186643 | .{ .src = .{ .mem, .mem, .none } }, |
| ... | @@ -186072,8 +186822,8 @@ const Temp = struct { | ... | @@ -186072,8 +186822,8 @@ const Temp = struct { |
| 186072 | .src_constraints = .{ .{ .signed_int = .xword }, .{ .signed_int = .xword }, .any }, | 186822 | .src_constraints = .{ .{ .signed_int = .xword }, .{ .signed_int = .xword }, .any }, |
| 186073 | .patterns = &.{ | 186823 | .patterns = &.{ |
| 186074 | .{ .src = .{ | 186824 | .{ .src = .{ |
| 186075 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 0 } }, | 186825 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 0 } }, |
| 186076 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 2 } }, | 186826 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 2 } }, |
| 186077 | .none, | 186827 | .none, |
| 186078 | } }, | 186828 | } }, |
| 186079 | }, | 186829 | }, |
| ... | @@ -186091,7 +186841,7 @@ const Temp = struct { | ... | @@ -186091,7 +186841,7 @@ const Temp = struct { |
| 186091 | .unused, | 186841 | .unused, |
| 186092 | .unused, | 186842 | .unused, |
| 186093 | }, | 186843 | }, |
| 186094 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .index = 0 } }, .unused }, | 186844 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| 186095 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, | 186845 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| 186096 | .each = .{ .once = &.{ | 186846 | .each = .{ .once = &.{ |
| 186097 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, | 186847 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| ... | @@ -186101,8 +186851,8 @@ const Temp = struct { | ... | @@ -186101,8 +186851,8 @@ const Temp = struct { |
| 186101 | .src_constraints = .{ .{ .unsigned_int = .xword }, .{ .unsigned_int = .xword }, .any }, | 186851 | .src_constraints = .{ .{ .unsigned_int = .xword }, .{ .unsigned_int = .xword }, .any }, |
| 186102 | .patterns = &.{ | 186852 | .patterns = &.{ |
| 186103 | .{ .src = .{ | 186853 | .{ .src = .{ |
| 186104 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 0 } }, | 186854 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 0 } }, |
| 186105 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .index = 2 } }, | 186855 | .{ .to_param_gpr_pair = .{ .cc = .ccc, .at = 2 } }, |
| 186106 | .none, | 186856 | .none, |
| 186107 | } }, | 186857 | } }, |
| 186108 | }, | 186858 | }, |
| ... | @@ -186120,7 +186870,7 @@ const Temp = struct { | ... | @@ -186120,7 +186870,7 @@ const Temp = struct { |
| 186120 | .unused, | 186870 | .unused, |
| 186121 | .unused, | 186871 | .unused, |
| 186122 | }, | 186872 | }, |
| 186123 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .index = 0 } }, .unused }, | 186873 | .dst_temps = .{ .{ .ret_gpr_pair = .{ .cc = .ccc, .at = 0 } }, .unused }, |
| 186124 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, | 186874 | .clobbers = .{ .eflags = true, .caller_preserved = .ccc }, |
| 186125 | .each = .{ .once = &.{ | 186875 | .each = .{ .once = &.{ |
| 186126 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, | 186876 | .{ ._, ._, .call, .tmp0d, ._, ._, ._ }, |
| ... | @@ -186137,10 +186887,10 @@ const Temp = struct { | ... | @@ -186137,10 +186887,10 @@ const Temp = struct { |
| 186137 | }, | 186887 | }, |
| 186138 | .call_frame = .{ .alignment = .@"16" }, | 186888 | .call_frame = .{ .alignment = .@"16" }, |
| 186139 | .extra_temps = .{ | 186889 | .extra_temps = .{ |
| 186140 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 186890 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186141 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 186891 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 186142 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 186892 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 186143 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 186893 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 186144 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divei4" } } }, | 186894 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divei4" } } }, |
| 186145 | .unused, | 186895 | .unused, |
| 186146 | .unused, | 186896 | .unused, |
| ... | @@ -186170,10 +186920,10 @@ const Temp = struct { | ... | @@ -186170,10 +186920,10 @@ const Temp = struct { |
| 186170 | }, | 186920 | }, |
| 186171 | .call_frame = .{ .alignment = .@"16" }, | 186921 | .call_frame = .{ .alignment = .@"16" }, |
| 186172 | .extra_temps = .{ | 186922 | .extra_temps = .{ |
| 186173 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 186923 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186174 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 186924 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 186175 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 186925 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 186176 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 186926 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 186177 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__udivei4" } } }, | 186927 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__udivei4" } } }, |
| 186178 | .unused, | 186928 | .unused, |
| 186179 | .unused, | 186929 | .unused, |
| ... | @@ -186534,12 +187284,12 @@ const Temp = struct { | ... | @@ -186534,12 +187284,12 @@ const Temp = struct { |
| 186534 | .call_frame = .{ .alignment = .@"16" }, | 187284 | .call_frame = .{ .alignment = .@"16" }, |
| 186535 | .extra_temps = .{ | 187285 | .extra_temps = .{ |
| 186536 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 187286 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 186537 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 187287 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186538 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 187288 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 186539 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 187289 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 186540 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 187290 | .{ .type = .i64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 186541 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divti3" } } }, | 187291 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divti3" } } }, |
| 186542 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .index = 0 } } }, | 187292 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186543 | .unused, | 187293 | .unused, |
| 186544 | .unused, | 187294 | .unused, |
| 186545 | .unused, | 187295 | .unused, |
| ... | @@ -186572,12 +187322,12 @@ const Temp = struct { | ... | @@ -186572,12 +187322,12 @@ const Temp = struct { |
| 186572 | .call_frame = .{ .alignment = .@"16" }, | 187322 | .call_frame = .{ .alignment = .@"16" }, |
| 186573 | .extra_temps = .{ | 187323 | .extra_temps = .{ |
| 186574 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 187324 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 186575 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 187325 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186576 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 187326 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 186577 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 187327 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 186578 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 187328 | .{ .type = .u64, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 186579 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__udivti3" } } }, | 187329 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__udivti3" } } }, |
| 186580 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .index = 0 } } }, | 187330 | .{ .type = .u64, .kind = .{ .ret_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186581 | .unused, | 187331 | .unused, |
| 186582 | .unused, | 187332 | .unused, |
| 186583 | .unused, | 187333 | .unused, |
| ... | @@ -186610,10 +187360,10 @@ const Temp = struct { | ... | @@ -186610,10 +187360,10 @@ const Temp = struct { |
| 186610 | .call_frame = .{ .alignment = .@"16" }, | 187360 | .call_frame = .{ .alignment = .@"16" }, |
| 186611 | .extra_temps = .{ | 187361 | .extra_temps = .{ |
| 186612 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 187362 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 186613 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 187363 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186614 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 187364 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 186615 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 187365 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 186616 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 187366 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 186617 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divei4" } } }, | 187367 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__divei4" } } }, |
| 186618 | .unused, | 187368 | .unused, |
| 186619 | .unused, | 187369 | .unused, |
| ... | @@ -186646,10 +187396,10 @@ const Temp = struct { | ... | @@ -186646,10 +187396,10 @@ const Temp = struct { |
| 186646 | .call_frame = .{ .alignment = .@"16" }, | 187396 | .call_frame = .{ .alignment = .@"16" }, |
| 186647 | .extra_temps = .{ | 187397 | .extra_temps = .{ |
| 186648 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, | 187398 | .{ .type = .isize, .kind = .{ .rc = .general_purpose } }, |
| 186649 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 0 } } }, | 187399 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 0 } } }, |
| 186650 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 1 } } }, | 187400 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 1 } } }, |
| 186651 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 2 } } }, | 187401 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 2 } } }, |
| 186652 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .index = 3 } } }, | 187402 | .{ .type = .usize, .kind = .{ .param_gpr = .{ .cc = .ccc, .at = 3 } } }, |
| 186653 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__udivei4" } } }, | 187403 | .{ .type = .usize, .kind = .{ .symbol = &.{ .name = "__udivei4" } } }, |
| 186654 | .unused, | 187404 | .unused, |
| 186655 | .unused, | 187405 | .unused, |
| ... | @@ -187117,8 +187867,7 @@ const Select = struct { | ... | @@ -187117,8 +187867,7 @@ const Select = struct { |
| 187117 | } | 187867 | } |
| 187118 | | 187868 | |
| 187119 | fn lowerReg(s: *const Select, reg: Register) Register { | 187869 | fn lowerReg(s: *const Select, reg: Register) Register { |
| 187120 | if (reg.class() != .x87) return reg; | 187870 | return if (reg.isClass(.x87)) @enumFromInt(@intFromEnum(Register.st0) + (@as(u3, @intCast(reg.enc())) -% s.top)) else reg; |
| 187121 | return @enumFromInt(@intFromEnum(Register.st0) + (@as(u3, @intCast(reg.enc())) -% s.top)); | | |
| 187122 | } | 187871 | } |
| 187123 | | 187872 | |
| 187124 | const Case = struct { | 187873 | const Case = struct { |
| ... | @@ -187505,6 +188254,8 @@ const Select = struct { | ... | @@ -187505,6 +188254,8 @@ const Select = struct { |
| 187505 | to_gpr, | 188254 | to_gpr, |
| 187506 | mut_gpr, | 188255 | mut_gpr, |
| 187507 | to_mut_gpr, | 188256 | to_mut_gpr, |
| | 188257 | to_gphi, |
| | 188258 | to_mut_gphi, |
| 187508 | x87, | 188259 | x87, |
| 187509 | to_x87, | 188260 | to_x87, |
| 187510 | mut_x87, | 188261 | mut_x87, |
| ... | @@ -187581,84 +188332,84 @@ const Select = struct { | ... | @@ -187581,84 +188332,84 @@ const Select = struct { |
| 187581 | .mut_mem => temp.isMut(cg) and temp.tracking(cg).short.isMemory(), | 188332 | .mut_mem => temp.isMut(cg) and temp.tracking(cg).short.isMemory(), |
| 187582 | .to_reg, .to_reg_pair, .to_param_gpr, .to_param_gpr_pair, .to_ret_gpr, .to_ret_gpr_pair => true, | 188333 | .to_reg, .to_reg_pair, .to_param_gpr, .to_param_gpr_pair, .to_ret_gpr, .to_ret_gpr_pair => true, |
| 187583 | .gpr => temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { | 188334 | .gpr => temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { |
| 187584 | .register => |reg| reg.class() == .general_purpose, | 188335 | .register => |reg| reg.isClass(.general_purpose), |
| 187585 | .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0, | 188336 | .register_offset => |reg_off| reg_off.reg.isClass(.general_purpose) and reg_off.off == 0, |
| 187586 | else => false, | 188337 | else => false, |
| 187587 | }, | 188338 | }, |
| 187588 | .immut_gpr => !temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { | 188339 | .immut_gpr => !temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { |
| 187589 | .register => |reg| reg.class() == .general_purpose, | 188340 | .register => |reg| reg.isClass(.general_purpose), |
| 187590 | .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0, | 188341 | .register_offset => |reg_off| reg_off.reg.isClass(.general_purpose) and reg_off.off == 0, |
| 187591 | else => false, | 188342 | else => false, |
| 187592 | }, | 188343 | }, |
| 187593 | .mut_gpr => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { | 188344 | .mut_gpr => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8 and switch (temp.tracking(cg).short) { |
| 187594 | .register => |reg| reg.class() == .general_purpose, | 188345 | .register => |reg| reg.isClass(.general_purpose), |
| 187595 | .register_offset => |reg_off| reg_off.reg.class() == .general_purpose and reg_off.off == 0, | 188346 | .register_offset => |reg_off| reg_off.reg.isClass(.general_purpose) and reg_off.off == 0, |
| 187596 | else => false, | 188347 | else => false, |
| 187597 | }, | 188348 | }, |
| 187598 | .to_gpr, .to_mut_gpr => temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8, | 188349 | .to_gpr, .to_mut_gpr, .to_gphi, .to_mut_gphi => temp.typeOf(cg).abiSize(cg.pt.zcu) <= 8, |
| 187599 | .x87 => switch (temp.tracking(cg).short) { | 188350 | .x87 => switch (temp.tracking(cg).short) { |
| 187600 | .register => |reg| reg.class() == .x87, | 188351 | .register => |reg| reg.isClass(.x87), |
| 187601 | .register_offset => |reg_off| reg_off.reg.class() == .x87 and reg_off.off == 0, | 188352 | .register_offset => |reg_off| reg_off.reg.isClass(.x87) and reg_off.off == 0, |
| 187602 | else => false, | 188353 | else => false, |
| 187603 | }, | 188354 | }, |
| 187604 | .mut_x87 => temp.isMut(cg) and switch (temp.tracking(cg).short) { | 188355 | .mut_x87 => temp.isMut(cg) and switch (temp.tracking(cg).short) { |
| 187605 | .register => |reg| reg.class() == .x87, | 188356 | .register => |reg| reg.isClass(.x87), |
| 187606 | .register_offset => |reg_off| reg_off.reg.class() == .x87 and reg_off.off == 0, | 188357 | .register_offset => |reg_off| reg_off.reg.isClass(.x87) and reg_off.off == 0, |
| 187607 | else => false, | 188358 | else => false, |
| 187608 | }, | 188359 | }, |
| 187609 | .to_x87, .to_mut_x87 => true, | 188360 | .to_x87, .to_mut_x87 => true, |
| 187610 | .mmx => switch (temp.tracking(cg).short) { | 188361 | .mmx => switch (temp.tracking(cg).short) { |
| 187611 | .register => |reg| reg.class() == .mmx, | 188362 | .register => |reg| reg.isClass(.mmx), |
| 187612 | .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0, | 188363 | .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0, |
| 187613 | else => false, | 188364 | else => false, |
| 187614 | }, | 188365 | }, |
| 187615 | .mut_mmx => temp.isMut(cg) and switch (temp.tracking(cg).short) { | 188366 | .mut_mmx => temp.isMut(cg) and switch (temp.tracking(cg).short) { |
| 187616 | .register => |reg| reg.class() == .mmx, | 188367 | .register => |reg| reg.isClass(.mmx), |
| 187617 | .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0, | 188368 | .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0, |
| 187618 | else => false, | 188369 | else => false, |
| 187619 | }, | 188370 | }, |
| 187620 | .to_mmx, .to_mut_mmx => true, | 188371 | .to_mmx, .to_mut_mmx => true, |
| 187621 | .mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) { | 188372 | .mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) { |
| 187622 | .register => |reg| reg.class() == .mmx, | 188373 | .register => |reg| reg.isClass(.mmx), |
| 187623 | .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0, | 188374 | .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0, |
| 187624 | else => false, | 188375 | else => false, |
| 187625 | }, | 188376 | }, |
| 187626 | .mut_mm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) { | 188377 | .mut_mm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 8 and switch (temp.tracking(cg).short) { |
| 187627 | .register => |reg| reg.class() == .mmx, | 188378 | .register => |reg| reg.isClass(.mmx), |
| 187628 | .register_offset => |reg_off| reg_off.reg.class() == .mmx and reg_off.off == 0, | 188379 | .register_offset => |reg_off| reg_off.reg.isClass(.mmx) and reg_off.off == 0, |
| 187629 | else => false, | 188380 | else => false, |
| 187630 | }, | 188381 | }, |
| 187631 | .to_mm, .to_mut_mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8, | 188382 | .to_mm, .to_mut_mm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 8, |
| 187632 | .sse => switch (temp.tracking(cg).short) { | 188383 | .sse => switch (temp.tracking(cg).short) { |
| 187633 | .register => |reg| reg.class() == .sse, | 188384 | .register => |reg| reg.isClass(.sse), |
| 187634 | .register_offset => |reg_off| reg_off.reg.class() == .sse and reg_off.off == 0, | 188385 | .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0, |
| 187635 | else => false, | 188386 | else => false, |
| 187636 | }, | 188387 | }, |
| 187637 | .mut_sse => temp.isMut(cg) and switch (temp.tracking(cg).short) { | 188388 | .mut_sse => temp.isMut(cg) and switch (temp.tracking(cg).short) { |
| 187638 | .register => |reg| reg.class() == .sse, | 188389 | .register => |reg| reg.isClass(.sse), |
| 187639 | .register_offset => |reg_off| reg_off.reg.class() == .sse and reg_off.off == 0, | 188390 | .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0, |
| 187640 | else => false, | 188391 | else => false, |
| 187641 | }, | 188392 | }, |
| 187642 | .to_sse, .to_mut_sse => true, | 188393 | .to_sse, .to_mut_sse => true, |
| 187643 | .xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) { | 188394 | .xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) { |
| 187644 | .register => |reg| reg.class() == .sse, | 188395 | .register => |reg| reg.isClass(.sse), |
| 187645 | .register_offset => |reg_off| reg_off.reg.class() == .sse and reg_off.off == 0, | 188396 | .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0, |
| 187646 | else => false, | 188397 | else => false, |
| 187647 | }, | 188398 | }, |
| 187648 | .mut_xmm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) { | 188399 | .mut_xmm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 16 and switch (temp.tracking(cg).short) { |
| 187649 | .register => |reg| reg.class() == .sse, | 188400 | .register => |reg| reg.isClass(.sse), |
| 187650 | .register_offset => |reg_off| reg_off.reg.class() == .sse and reg_off.off == 0, | 188401 | .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0, |
| 187651 | else => false, | 188402 | else => false, |
| 187652 | }, | 188403 | }, |
| 187653 | .to_xmm, .to_mut_xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16, | 188404 | .to_xmm, .to_mut_xmm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 16, |
| 187654 | .ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) { | 188405 | .ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) { |
| 187655 | .register => |reg| reg.class() == .sse, | 188406 | .register => |reg| reg.isClass(.sse), |
| 187656 | .register_offset => |reg_off| reg_off.reg.class() == .sse and reg_off.off == 0, | 188407 | .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0, |
| 187657 | else => false, | 188408 | else => false, |
| 187658 | }, | 188409 | }, |
| 187659 | .mut_ymm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) { | 188410 | .mut_ymm => temp.isMut(cg) and temp.typeOf(cg).abiSize(cg.pt.zcu) == 32 and switch (temp.tracking(cg).short) { |
| 187660 | .register => |reg| reg.class() == .sse, | 188411 | .register => |reg| reg.isClass(.sse), |
| 187661 | .register_offset => |reg_off| reg_off.reg.class() == .sse and reg_off.off == 0, | 188412 | .register_offset => |reg_off| reg_off.reg.isClass(.sse) and reg_off.off == 0, |
| 187662 | else => false, | 188413 | else => false, |
| 187663 | }, | 188414 | }, |
| 187664 | .to_ymm, .to_mut_ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32, | 188415 | .to_ymm, .to_mut_ymm => temp.typeOf(cg).abiSize(cg.pt.zcu) == 32, |
| ... | @@ -187684,12 +188435,14 @@ const Select = struct { | ... | @@ -187684,12 +188435,14 @@ const Select = struct { |
| 187684 | .mut_mem, .to_mut_mem => try temp.toBase(true, cg), | 188435 | .mut_mem, .to_mut_mem => try temp.toBase(true, cg), |
| 187685 | .to_reg => |reg| try temp.toReg(reg, cg), | 188436 | .to_reg => |reg| try temp.toReg(reg, cg), |
| 187686 | .to_reg_pair => |regs| try temp.toRegPair(regs, cg), | 188437 | .to_reg_pair => |regs| try temp.toRegPair(regs, cg), |
| 187687 | .to_param_gpr => |param_spec| try temp.toReg(abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index], cg), | 188438 | .to_param_gpr => |param_spec| try temp.toReg(abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.at], cg), |
| 187688 | .to_param_gpr_pair => |param_spec| try temp.toRegPair(abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index..][0..2].*, cg), | 188439 | .to_param_gpr_pair => |param_spec| try temp.toRegPair(abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.at..][0..2].*, cg), |
| 187689 | .to_ret_gpr => |ret_spec| try temp.toReg(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index], cg), | 188440 | .to_ret_gpr => |ret_spec| try temp.toReg(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.at], cg), |
| 187690 | .to_ret_gpr_pair => |ret_spec| try temp.toRegPair(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index..][0..2].*, cg), | 188441 | .to_ret_gpr_pair => |ret_spec| try temp.toRegPair(abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.at..][0..2].*, cg), |
| 187691 | .gpr, .immut_gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg), | 188442 | .gpr, .immut_gpr, .to_gpr => try temp.toRegClass(false, .general_purpose, cg), |
| 187692 | .mut_gpr, .to_mut_gpr => try temp.toRegClass(true, .general_purpose, cg), | 188443 | .mut_gpr, .to_mut_gpr => try temp.toRegClass(true, .general_purpose, cg), |
| | 188444 | .to_gphi => try temp.toRegClass(false, .gphi, cg), |
| | 188445 | .to_mut_gphi => try temp.toRegClass(true, .gphi, cg), |
| 187693 | .x87, .to_x87 => try temp.toRegClass(false, .x87, cg), | 188446 | .x87, .to_x87 => try temp.toRegClass(false, .x87, cg), |
| 187694 | .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg), | 188447 | .mut_x87, .to_mut_x87 => try temp.toRegClass(true, .x87, cg), |
| 187695 | .mmx, .to_mmx, .mm, .to_mm => try temp.toRegClass(false, .mmx, cg), | 188448 | .mmx, .to_mmx, .mm, .to_mm => try temp.toRegClass(false, .mmx, cg), |
| ... | @@ -187761,7 +188514,7 @@ const Select = struct { | ... | @@ -187761,7 +188514,7 @@ const Select = struct { |
| 187761 | | 188514 | |
| 187762 | const CallConvRegSpec = struct { | 188515 | const CallConvRegSpec = struct { |
| 187763 | cc: Case.CallConv, | 188516 | cc: Case.CallConv, |
| 187764 | index: u2, | 188517 | at: u2, |
| 187765 | | 188518 | |
| 187766 | fn tag(spec: CallConvRegSpec, cg: *const CodeGen) std.builtin.CallingConvention.Tag { | 188519 | fn tag(spec: CallConvRegSpec, cg: *const CodeGen) std.builtin.CallingConvention.Tag { |
| 187767 | return switch (spec.cc) { | 188520 | return switch (spec.cc) { |
| ... | @@ -187778,10 +188531,10 @@ const Select = struct { | ... | @@ -187778,10 +188531,10 @@ const Select = struct { |
| 187778 | else => return reg_locks, | 188531 | else => return reg_locks, |
| 187779 | .reg => |reg| .{ reg, .none }, | 188532 | .reg => |reg| .{ reg, .none }, |
| 187780 | .reg_pair => |regs| regs, | 188533 | .reg_pair => |regs| regs, |
| 187781 | .param_gpr => |param_spec| abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index..][0..1].* ++ .{.none}, | 188534 | .param_gpr => |param_spec| abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.at..][0..1].* ++ .{.none}, |
| 187782 | .param_gpr_pair => |param_spec| abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index..][0..2].*, | 188535 | .param_gpr_pair => |param_spec| abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.at..][0..2].*, |
| 187783 | .ret_gpr => |ret_spec| abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index..][0..1].* ++ .{.none}, | 188536 | .ret_gpr => |ret_spec| abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.at..][0..1].* ++ .{.none}, |
| 187784 | .ret_gpr_pair => |ret_spec| abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index..][0..2].*, | 188537 | .ret_gpr_pair => |ret_spec| abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.at..][0..2].*, |
| 187785 | }; | 188538 | }; |
| 187786 | for (regs, &reg_locks) |reg, *reg_lock| { | 188539 | for (regs, &reg_locks) |reg, *reg_lock| { |
| 187787 | if (reg == .none) continue; | 188540 | if (reg == .none) continue; |
| ... | @@ -187791,13 +188544,6 @@ const Select = struct { | ... | @@ -187791,13 +188544,6 @@ const Select = struct { |
| 187791 | } | 188544 | } |
| 187792 | return reg_locks; | 188545 | return reg_locks; |
| 187793 | } | 188546 | } |
| 187794 | | | |
| 187795 | fn finish(kind: Kind, temp: Temp, cg: *CodeGen) void { | | |
| 187796 | switch (kind) { | | |
| 187797 | else => {}, | | |
| 187798 | inline .rc_mask, .mut_rc_mask, .ref_mask => |mask| temp.asMask(mask.info, cg), | | |
| 187799 | } | | |
| 187800 | } | | |
| 187801 | }; | 188547 | }; |
| 187802 | | 188548 | |
| 187803 | fn create(spec: TempSpec, s: *const Select) InnerError!struct { Temp, bool } { | 188549 | fn create(spec: TempSpec, s: *const Select) InnerError!struct { Temp, bool } { |
| ... | @@ -187822,24 +188568,24 @@ const Select = struct { | ... | @@ -187822,24 +188568,24 @@ const Select = struct { |
| 187822 | .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true }, | 188568 | .reg => |reg| .{ try cg.tempInit(spec.type, .{ .register = reg }), true }, |
| 187823 | .reg_pair => |regs| .{ try cg.tempInit(spec.type, .{ .register_pair = regs }), true }, | 188569 | .reg_pair => |regs| .{ try cg.tempInit(spec.type, .{ .register_pair = regs }), true }, |
| 187824 | .param_gpr => |param_spec| .{ try cg.tempInit(spec.type, .{ | 188570 | .param_gpr => |param_spec| .{ try cg.tempInit(spec.type, .{ |
| 187825 | .register = abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index], | 188571 | .register = abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.at], |
| 187826 | }), true }, | 188572 | }), true }, |
| 187827 | .param_gpr_pair => |param_spec| .{ try cg.tempInit(spec.type, .{ | 188573 | .param_gpr_pair => |param_spec| .{ try cg.tempInit(spec.type, .{ |
| 187828 | .register_pair = abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.index..][0..2].*, | 188574 | .register_pair = abi.getCAbiIntParamRegs(param_spec.tag(cg))[param_spec.at..][0..2].*, |
| 187829 | }), true }, | 188575 | }), true }, |
| 187830 | .ret_gpr => |ret_spec| .{ try cg.tempInit(spec.type, .{ | 188576 | .ret_gpr => |ret_spec| .{ try cg.tempInit(spec.type, .{ |
| 187831 | .register = abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index], | 188577 | .register = abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.at], |
| 187832 | }), true }, | 188578 | }), true }, |
| 187833 | .ret_gpr_pair => |ret_spec| .{ try cg.tempInit(spec.type, .{ | 188579 | .ret_gpr_pair => |ret_spec| .{ try cg.tempInit(spec.type, .{ |
| 187834 | .register_pair = abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.index..][0..2].*, | 188580 | .register_pair = abi.getCAbiIntReturnRegs(ret_spec.tag(cg))[ret_spec.at..][0..2].*, |
| 187835 | }), true }, | 188581 | }), true }, |
| 187836 | .rc => |rc| .{ try cg.tempAllocReg(spec.type, regSetForRegClass(rc)), true }, | 188582 | .rc => |rc| .{ try cg.tempAllocReg(spec.type, regSetForRegClass(rc)), true }, |
| 187837 | .rc_pair => |rc| .{ try cg.tempAllocRegPair(spec.type, regSetForRegClass(rc)), true }, | 188583 | .rc_pair => |rc| .{ try cg.tempAllocRegPair(spec.type, regSetForRegClass(rc)), true }, |
| 187838 | .mut_rc => |ref_rc| { | 188584 | .mut_rc => |ref_rc| { |
| 187839 | const temp = ref_rc.ref.tempOf(s); | 188585 | const temp = ref_rc.ref.tempOf(s); |
| 187840 | if (temp.isMut(cg)) switch (temp.tracking(cg).short) { | 188586 | if (temp.isMut(cg)) switch (temp.tracking(cg).short) { |
| 187841 | .register => |reg| if (reg.class() == ref_rc.rc) return .{ temp, false }, | 188587 | .register => |reg| if (reg.isClass(ref_rc.rc)) return .{ temp, false }, |
| 187842 | .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.class() == ref_rc.rc) return .{ temp, false }, | 188588 | .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.isClass(ref_rc.rc)) return .{ temp, false }, |
| 187843 | else => {}, | 188589 | else => {}, |
| 187844 | }; | 188590 | }; |
| 187845 | return .{ try cg.tempAllocReg(spec.type, regSetForRegClass(ref_rc.rc)), true }; | 188591 | return .{ try cg.tempAllocReg(spec.type, regSetForRegClass(ref_rc.rc)), true }; |
| ... | @@ -187849,8 +188595,8 @@ const Select = struct { | ... | @@ -187849,8 +188595,8 @@ const Select = struct { |
| 187849 | .mut_rc_mask => |ref_rc_mask| { | 188595 | .mut_rc_mask => |ref_rc_mask| { |
| 187850 | const temp = ref_rc_mask.ref.tempOf(s); | 188596 | const temp = ref_rc_mask.ref.tempOf(s); |
| 187851 | if (temp.isMut(cg)) switch (temp.tracking(cg).short) { | 188597 | if (temp.isMut(cg)) switch (temp.tracking(cg).short) { |
| 187852 | .register => |reg| if (reg.class() == ref_rc_mask.rc) return .{ temp, false }, | 188598 | .register => |reg| if (reg.isClass(ref_rc_mask.rc)) return .{ temp, false }, |
| 187853 | .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.class() == ref_rc_mask.rc) return .{ temp, false }, | 188599 | .register_offset => |reg_off| if (reg_off.off == 0 and reg_off.reg.isClass(ref_rc_mask.rc)) return .{ temp, false }, |
| 187854 | else => {}, | 188600 | else => {}, |
| 187855 | }; | 188601 | }; |
| 187856 | return .{ try cg.tempAllocReg(spec.type, regSetForRegClass(ref_rc_mask.rc)), true }; | 188602 | return .{ try cg.tempAllocReg(spec.type, regSetForRegClass(ref_rc_mask.rc)), true }; |
| ... | @@ -188228,6 +188974,14 @@ const Select = struct { | ... | @@ -188228,6 +188974,14 @@ const Select = struct { |
| 188228 | } }), true }, | 188974 | } }), true }, |
| 188229 | }; | 188975 | }; |
| 188230 | } | 188976 | } |
| | 188977 | |
| | 188978 | fn finish(spec: TempSpec, temp: *Temp, cg: *CodeGen) InnerError!void { |
| | 188979 | switch (spec.kind) { |
| | 188980 | else => {}, |
| | 188981 | inline .rc_mask, .mut_rc_mask, .ref_mask => |mask| temp.asMask(mask.info, cg), |
| | 188982 | } |
| | 188983 | cg.temp_type[@intFromEnum(temp.unwrap(cg).temp)] = spec.type; |
| | 188984 | } |
| 188231 | }; | 188985 | }; |
| 188232 | | 188986 | |
| 188233 | const Instruction = struct { | 188987 | const Instruction = struct { |
| ... | @@ -188255,8 +189009,7 @@ const Select = struct { | ... | @@ -188255,8 +189009,7 @@ const Select = struct { |
| 188255 | | 189009 | |
| 188256 | const Tag = enum(u3) { | 189010 | const Tag = enum(u3) { |
| 188257 | none, | 189011 | none, |
| 188258 | backward_label, | 189012 | label, |
| 188259 | forward_label, | | |
| 188260 | ref, | 189013 | ref, |
| 188261 | simm, | 189014 | simm, |
| 188262 | uimm, | 189015 | uimm, |
| ... | @@ -188626,16 +189379,16 @@ const Select = struct { | ... | @@ -188626,16 +189379,16 @@ const Select = struct { |
| 188626 | | 189379 | |
| 188627 | const @"_": Select.Operand = .{ .flags = .{ .tag = .none } }; | 189380 | const @"_": Select.Operand = .{ .flags = .{ .tag = .none } }; |
| 188628 | | 189381 | |
| 188629 | const @"0b": Select.Operand = .{ .flags = .{ .tag = .backward_label, .base = .{ .ref = .tmp0, .size = .none } } }; | 189382 | const @"0b": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = ~@as(i32, 0) }; |
| 188630 | const @"0f": Select.Operand = .{ .flags = .{ .tag = .forward_label, .base = .{ .ref = .tmp0, .size = .none } } }; | 189383 | const @"0f": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = @as(i32, 0) }; |
| 188631 | const @"1b": Select.Operand = .{ .flags = .{ .tag = .backward_label, .base = .{ .ref = .tmp1, .size = .none } } }; | 189384 | const @"1b": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = ~@as(i32, 1) }; |
| 188632 | const @"1f": Select.Operand = .{ .flags = .{ .tag = .forward_label, .base = .{ .ref = .tmp1, .size = .none } } }; | 189385 | const @"1f": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = @as(i32, 1) }; |
| 188633 | const @"2b": Select.Operand = .{ .flags = .{ .tag = .backward_label, .base = .{ .ref = .tmp2, .size = .none } } }; | 189386 | const @"2b": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = ~@as(i32, 2) }; |
| 188634 | const @"2f": Select.Operand = .{ .flags = .{ .tag = .forward_label, .base = .{ .ref = .tmp2, .size = .none } } }; | 189387 | const @"2f": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = @as(i32, 2) }; |
| 188635 | const @"3b": Select.Operand = .{ .flags = .{ .tag = .backward_label, .base = .{ .ref = .tmp3, .size = .none } } }; | 189388 | const @"3b": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = ~@as(i32, 3) }; |
| 188636 | const @"3f": Select.Operand = .{ .flags = .{ .tag = .forward_label, .base = .{ .ref = .tmp3, .size = .none } } }; | 189389 | const @"3f": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = @as(i32, 3) }; |
| 188637 | const @"4b": Select.Operand = .{ .flags = .{ .tag = .backward_label, .base = .{ .ref = .tmp4, .size = .none } } }; | 189390 | const @"4b": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = ~@as(i32, 4) }; |
| 188638 | const @"4f": Select.Operand = .{ .flags = .{ .tag = .forward_label, .base = .{ .ref = .tmp4, .size = .none } } }; | 189391 | const @"4f": Select.Operand = .{ .flags = .{ .tag = .label }, .imm = @as(i32, 4) }; |
| 188639 | | 189392 | |
| 188640 | const tmp0l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0l } }; | 189393 | const tmp0l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0l } }; |
| 188641 | const tmp0h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0h } }; | 189394 | const tmp0h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0h } }; |
| ... | @@ -188648,6 +189401,8 @@ const Select = struct { | ... | @@ -188648,6 +189401,8 @@ const Select = struct { |
| 188648 | const tmp0t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0t } }; | 189401 | const tmp0t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0t } }; |
| 188649 | const tmp0x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0x } }; | 189402 | const tmp0x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0x } }; |
| 188650 | const tmp0y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0y } }; | 189403 | const tmp0y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0y } }; |
| | 189404 | const tmp0q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0q }, .imm = 1 }; |
| | 189405 | const tmp0q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp0q }, .imm = 2 }; |
| 188651 | | 189406 | |
| 188652 | const tmp1l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1l } }; | 189407 | const tmp1l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1l } }; |
| 188653 | const tmp1h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1h } }; | 189408 | const tmp1h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1h } }; |
| ... | @@ -188660,6 +189415,8 @@ const Select = struct { | ... | @@ -188660,6 +189415,8 @@ const Select = struct { |
| 188660 | const tmp1t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1t } }; | 189415 | const tmp1t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1t } }; |
| 188661 | const tmp1x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1x } }; | 189416 | const tmp1x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1x } }; |
| 188662 | const tmp1y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1y } }; | 189417 | const tmp1y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1y } }; |
| | 189418 | const tmp1q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1q }, .imm = 1 }; |
| | 189419 | const tmp1q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp1q }, .imm = 2 }; |
| 188663 | | 189420 | |
| 188664 | const tmp2l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2l } }; | 189421 | const tmp2l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2l } }; |
| 188665 | const tmp2h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2h } }; | 189422 | const tmp2h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2h } }; |
| ... | @@ -188672,6 +189429,8 @@ const Select = struct { | ... | @@ -188672,6 +189429,8 @@ const Select = struct { |
| 188672 | const tmp2t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2t } }; | 189429 | const tmp2t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2t } }; |
| 188673 | const tmp2x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2x } }; | 189430 | const tmp2x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2x } }; |
| 188674 | const tmp2y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2y } }; | 189431 | const tmp2y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2y } }; |
| | 189432 | const tmp2q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2q }, .imm = 1 }; |
| | 189433 | const tmp2q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp2q }, .imm = 2 }; |
| 188675 | | 189434 | |
| 188676 | const tmp3l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3l } }; | 189435 | const tmp3l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3l } }; |
| 188677 | const tmp3h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3h } }; | 189436 | const tmp3h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3h } }; |
| ... | @@ -188684,6 +189443,8 @@ const Select = struct { | ... | @@ -188684,6 +189443,8 @@ const Select = struct { |
| 188684 | const tmp3t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3t } }; | 189443 | const tmp3t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3t } }; |
| 188685 | const tmp3x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3x } }; | 189444 | const tmp3x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3x } }; |
| 188686 | const tmp3y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3y } }; | 189445 | const tmp3y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3y } }; |
| | 189446 | const tmp3q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3q }, .imm = 1 }; |
| | 189447 | const tmp3q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp3q }, .imm = 2 }; |
| 188687 | | 189448 | |
| 188688 | const tmp4l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4l } }; | 189449 | const tmp4l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4l } }; |
| 188689 | const tmp4h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4h } }; | 189450 | const tmp4h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4h } }; |
| ... | @@ -188696,6 +189457,8 @@ const Select = struct { | ... | @@ -188696,6 +189457,8 @@ const Select = struct { |
| 188696 | const tmp4t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4t } }; | 189457 | const tmp4t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4t } }; |
| 188697 | const tmp4x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4x } }; | 189458 | const tmp4x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4x } }; |
| 188698 | const tmp4y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4y } }; | 189459 | const tmp4y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4y } }; |
| | 189460 | const tmp4q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4q }, .imm = 1 }; |
| | 189461 | const tmp4q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp4q }, .imm = 2 }; |
| 188699 | | 189462 | |
| 188700 | const tmp5l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5l } }; | 189463 | const tmp5l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5l } }; |
| 188701 | const tmp5h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5h } }; | 189464 | const tmp5h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5h } }; |
| ... | @@ -188708,6 +189471,8 @@ const Select = struct { | ... | @@ -188708,6 +189471,8 @@ const Select = struct { |
| 188708 | const tmp5t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5t } }; | 189471 | const tmp5t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5t } }; |
| 188709 | const tmp5x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5x } }; | 189472 | const tmp5x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5x } }; |
| 188710 | const tmp5y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5y } }; | 189473 | const tmp5y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5y } }; |
| | 189474 | const tmp5q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5q }, .imm = 1 }; |
| | 189475 | const tmp5q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp5q }, .imm = 2 }; |
| 188711 | | 189476 | |
| 188712 | const tmp6l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6l } }; | 189477 | const tmp6l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6l } }; |
| 188713 | const tmp6h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6h } }; | 189478 | const tmp6h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6h } }; |
| ... | @@ -188720,6 +189485,8 @@ const Select = struct { | ... | @@ -188720,6 +189485,8 @@ const Select = struct { |
| 188720 | const tmp6t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6t } }; | 189485 | const tmp6t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6t } }; |
| 188721 | const tmp6x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6x } }; | 189486 | const tmp6x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6x } }; |
| 188722 | const tmp6y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6y } }; | 189487 | const tmp6y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6y } }; |
| | 189488 | const tmp6q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6q }, .imm = 1 }; |
| | 189489 | const tmp6q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp6q }, .imm = 2 }; |
| 188723 | | 189490 | |
| 188724 | const tmp7l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7l } }; | 189491 | const tmp7l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7l } }; |
| 188725 | const tmp7h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7h } }; | 189492 | const tmp7h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7h } }; |
| ... | @@ -188732,6 +189499,8 @@ const Select = struct { | ... | @@ -188732,6 +189499,8 @@ const Select = struct { |
| 188732 | const tmp7t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7t } }; | 189499 | const tmp7t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7t } }; |
| 188733 | const tmp7x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7x } }; | 189500 | const tmp7x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7x } }; |
| 188734 | const tmp7y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7y } }; | 189501 | const tmp7y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7y } }; |
| | 189502 | const tmp7q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7q }, .imm = 1 }; |
| | 189503 | const tmp7q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp7q }, .imm = 2 }; |
| 188735 | | 189504 | |
| 188736 | const tmp8l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8l } }; | 189505 | const tmp8l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8l } }; |
| 188737 | const tmp8h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8h } }; | 189506 | const tmp8h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8h } }; |
| ... | @@ -188744,6 +189513,8 @@ const Select = struct { | ... | @@ -188744,6 +189513,8 @@ const Select = struct { |
| 188744 | const tmp8t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8t } }; | 189513 | const tmp8t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8t } }; |
| 188745 | const tmp8x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8x } }; | 189514 | const tmp8x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8x } }; |
| 188746 | const tmp8y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8y } }; | 189515 | const tmp8y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8y } }; |
| | 189516 | const tmp8q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8q }, .imm = 1 }; |
| | 189517 | const tmp8q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp8q }, .imm = 2 }; |
| 188747 | | 189518 | |
| 188748 | const tmp9l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9l } }; | 189519 | const tmp9l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9l } }; |
| 188749 | const tmp9h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9h } }; | 189520 | const tmp9h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9h } }; |
| ... | @@ -188756,6 +189527,8 @@ const Select = struct { | ... | @@ -188756,6 +189527,8 @@ const Select = struct { |
| 188756 | const tmp9t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9t } }; | 189527 | const tmp9t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9t } }; |
| 188757 | const tmp9x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9x } }; | 189528 | const tmp9x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9x } }; |
| 188758 | const tmp9y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9y } }; | 189529 | const tmp9y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9y } }; |
| | 189530 | const tmp9q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9q }, .imm = 1 }; |
| | 189531 | const tmp9q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp9q }, .imm = 2 }; |
| 188759 | | 189532 | |
| 188760 | const tmp10l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10l } }; | 189533 | const tmp10l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10l } }; |
| 188761 | const tmp10h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10h } }; | 189534 | const tmp10h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10h } }; |
| ... | @@ -188768,6 +189541,8 @@ const Select = struct { | ... | @@ -188768,6 +189541,8 @@ const Select = struct { |
| 188768 | const tmp10t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10t } }; | 189541 | const tmp10t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10t } }; |
| 188769 | const tmp10x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10x } }; | 189542 | const tmp10x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10x } }; |
| 188770 | const tmp10y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10y } }; | 189543 | const tmp10y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10y } }; |
| | 189544 | const tmp10q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10q }, .imm = 1 }; |
| | 189545 | const tmp10q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .tmp10q }, .imm = 2 }; |
| 188771 | | 189546 | |
| 188772 | const dst0l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0l } }; | 189547 | const dst0l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0l } }; |
| 188773 | const dst0h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0h } }; | 189548 | const dst0h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0h } }; |
| ... | @@ -188780,6 +189555,8 @@ const Select = struct { | ... | @@ -188780,6 +189555,8 @@ const Select = struct { |
| 188780 | const dst0t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0t } }; | 189555 | const dst0t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0t } }; |
| 188781 | const dst0x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0x } }; | 189556 | const dst0x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0x } }; |
| 188782 | const dst0y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0y } }; | 189557 | const dst0y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0y } }; |
| | 189558 | const dst0q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0q }, .imm = 1 }; |
| | 189559 | const dst0q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst0q }, .imm = 2 }; |
| 188783 | | 189560 | |
| 188784 | const dst1l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1l } }; | 189561 | const dst1l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1l } }; |
| 188785 | const dst1h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1h } }; | 189562 | const dst1h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1h } }; |
| ... | @@ -188792,6 +189569,8 @@ const Select = struct { | ... | @@ -188792,6 +189569,8 @@ const Select = struct { |
| 188792 | const dst1t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1t } }; | 189569 | const dst1t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1t } }; |
| 188793 | const dst1x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1x } }; | 189570 | const dst1x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1x } }; |
| 188794 | const dst1y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1y } }; | 189571 | const dst1y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1y } }; |
| | 189572 | const dst1q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1q }, .imm = 1 }; |
| | 189573 | const dst1q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .dst1q }, .imm = 2 }; |
| 188795 | | 189574 | |
| 188796 | const src0l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0l } }; | 189575 | const src0l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0l } }; |
| 188797 | const src0h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0h } }; | 189576 | const src0h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0h } }; |
| ... | @@ -188804,6 +189583,8 @@ const Select = struct { | ... | @@ -188804,6 +189583,8 @@ const Select = struct { |
| 188804 | const src0t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0t } }; | 189583 | const src0t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0t } }; |
| 188805 | const src0x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0x } }; | 189584 | const src0x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0x } }; |
| 188806 | const src0y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0y } }; | 189585 | const src0y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0y } }; |
| | 189586 | const src0q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0q }, .imm = 1 }; |
| | 189587 | const src0q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src0q }, .imm = 2 }; |
| 188807 | | 189588 | |
| 188808 | const src1l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1l } }; | 189589 | const src1l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1l } }; |
| 188809 | const src1h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1h } }; | 189590 | const src1h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1h } }; |
| ... | @@ -188816,6 +189597,8 @@ const Select = struct { | ... | @@ -188816,6 +189597,8 @@ const Select = struct { |
| 188816 | const src1t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1t } }; | 189597 | const src1t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1t } }; |
| 188817 | const src1x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1x } }; | 189598 | const src1x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1x } }; |
| 188818 | const src1y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1y } }; | 189599 | const src1y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1y } }; |
| | 189600 | const src1q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1q }, .imm = 1 }; |
| | 189601 | const src1q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src1q }, .imm = 2 }; |
| 188819 | | 189602 | |
| 188820 | const src2l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2l } }; | 189603 | const src2l: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2l } }; |
| 188821 | const src2h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2h } }; | 189604 | const src2h: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2h } }; |
| ... | @@ -188828,6 +189611,8 @@ const Select = struct { | ... | @@ -188828,6 +189611,8 @@ const Select = struct { |
| 188828 | const src2t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2t } }; | 189611 | const src2t: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2t } }; |
| 188829 | const src2x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2x } }; | 189612 | const src2x: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2x } }; |
| 188830 | const src2y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2y } }; | 189613 | const src2y: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2y } }; |
| | 189614 | const src2q0: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2q }, .imm = 1 }; |
| | 189615 | const src2q1: Select.Operand = .{ .flags = .{ .tag = .ref, .base = .src2q }, .imm = 2 }; |
| 188831 | | 189616 | |
| 188832 | fn si(imm: i32) Select.Operand { | 189617 | fn si(imm: i32) Select.Operand { |
| 188833 | return .{ .flags = .{ .tag = .simm }, .imm = imm }; | 189618 | return .{ .flags = .{ .tag = .simm }, .imm = imm }; |
| ... | @@ -189207,24 +189992,41 @@ const Select = struct { | ... | @@ -189207,24 +189992,41 @@ const Select = struct { |
| 189207 | fn lower(op: Select.Operand, s: *Select) InnerError!CodeGen.Operand { | 189992 | fn lower(op: Select.Operand, s: *Select) InnerError!CodeGen.Operand { |
| 189208 | return switch (op.flags.tag) { | 189993 | return switch (op.flags.tag) { |
| 189209 | .none => .none, | 189994 | .none => .none, |
| 189210 | .backward_label => .{ .inst = s.labels[@intFromEnum(op.flags.base.ref)].backward.? }, | 189995 | .label => if (op.imm < 0) |
| 189211 | .forward_label => for (&s.labels[@intFromEnum(op.flags.base.ref)].forward) |*label| { | 189996 | .{ .inst = s.labels[@intCast(~op.imm)].backward.? } |
| | 189997 | else for (&s.labels[@intCast(op.imm)].forward) |*label| { |
| 189212 | if (label.*) |_| continue; | 189998 | if (label.*) |_| continue; |
| 189213 | label.* = @intCast(s.cg.mir_instructions.len); | 189999 | label.* = @intCast(s.cg.mir_instructions.len); |
| 189214 | break .{ .inst = undefined }; | 190000 | break .{ .inst = undefined }; |
| 189215 | } else unreachable, | 190001 | } else unreachable, |
| 189216 | .ref => switch (op.flags.base.ref.valueOf(s)) { | 190002 | .ref => switch (op.imm) { |
| 189217 | .immediate => |imm| .{ .imm = switch (op.flags.base.size) { | 190003 | else => unreachable, |
| 189218 | .byte => if (std.math.cast(i8, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(@as(u8, @intCast(imm))), | 190004 | 0 => switch (op.flags.base.ref.valueOf(s)) { |
| 189219 | .word => if (std.math.cast(i16, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(@as(u16, @intCast(imm))), | 190005 | .none, .unreach, .dead, .undef => unreachable, |
| 189220 | .dword => if (std.math.cast(i32, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(@as(u32, @intCast(imm))), | 190006 | .immediate => |imm| .{ .imm = switch (op.flags.base.size) { |
| 189221 | .qword => if (std.math.cast(i32, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(imm), | 190007 | .byte => if (std.math.cast(i8, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(@as(u8, @intCast(imm))), |
| 189222 | else => unreachable, | 190008 | .word => if (std.math.cast(i16, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(@as(u16, @intCast(imm))), |
| 189223 | } }, | 190009 | .dword => if (std.math.cast(i32, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(@as(u32, @intCast(imm))), |
| 189224 | else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ .size = op.flags.base.size }) }, | 190010 | .qword => if (std.math.cast(i32, @as(i64, @bitCast(imm)))) |simm| .s(simm) else .u(imm), |
| 189225 | .register => |reg| .{ .reg = s.lowerReg(reg.toSize(op.flags.base.size, s.cg.target)) }, | 190011 | else => unreachable, |
| 189226 | .register_mask => |reg_mask| .{ .reg = s.lowerReg(reg_mask.reg.toSize(op.flags.base.size, s.cg.target)) }, | 190012 | } }, |
| 189227 | .lea_symbol => |sym_off| .{ .imm = .rel(sym_off) }, | 190013 | .eflags => unreachable, |
| | 190014 | .register => |reg| .{ .reg = s.lowerReg(reg.toSize(op.flags.base.size, s.cg.target)) }, |
| | 190015 | .register_pair, .register_triple, .register_quadruple, .register_offset, .register_overflow => unreachable, |
| | 190016 | .register_mask => |reg_mask| .{ .reg = s.lowerReg(reg_mask.reg.toSize(op.flags.base.size, s.cg.target)) }, |
| | 190017 | else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ .size = op.flags.base.size }) }, |
| | 190018 | .lea_symbol => |sym_off| .{ .imm = .rel(sym_off) }, |
| | 190019 | .load_direct, .lea_direct, .load_got, .lea_got, .lea_frame, .elementwise_args, .reserved_frame, .air_ref => unreachable, |
| | 190020 | }, |
| | 190021 | 1...2 => |imm| switch (op.flags.base.ref.valueOf(s)) { |
| | 190022 | inline .register_pair, .register_triple, .register_quadruple => |regs| .{ |
| | 190023 | .reg = s.lowerReg(regs[@intCast(imm - 1)].toSize(op.flags.base.size, s.cg.target)), |
| | 190024 | }, |
| | 190025 | else => |mcv| .{ .mem = try mcv.mem(s.cg, .{ |
| | 190026 | .size = op.flags.base.size, |
| | 190027 | .disp = @as(i32, @intCast(@divExact(op.flags.base.size.bitSize(s.cg.target), 8))) * (imm - 1), |
| | 190028 | }) }, |
| | 190029 | }, |
| 189228 | }, | 190030 | }, |
| 189229 | .simm => .{ .imm = .s(op.adjustedImm(i32, s)) }, | 190031 | .simm => .{ .imm = .s(op.adjustedImm(i32, s)) }, |
| 189230 | .uimm => .{ .imm = .u(@bitCast(op.adjustedImm(i64, s))) }, | 190032 | .uimm => .{ .imm = .u(@bitCast(op.adjustedImm(i64, s))) }, |
| ... | @@ -189392,11 +190194,8 @@ fn select( | ... | @@ -189392,11 +190194,8 @@ fn select( |
| 189392 | }, | 190194 | }, |
| 189393 | } | 190195 | } |
| 189394 | } | 190196 | } |
| 189395 | for (case.dst_temps[0..dst_temps.len], dst_temps, dst_tys) |tmp_kind, dst_temp, dst_ty| { | | |
| 189396 | tmp_kind.finish(dst_temp, cg); | | |
| 189397 | cg.temp_type[@intFromEnum(dst_temp.unwrap(cg).temp)] = dst_ty; | | |
| 189398 | } | | |
| 189399 | for (tmp_owned, s_tmp_temps) |owned, temp| if (owned) try temp.die(cg); | 190197 | for (tmp_owned, s_tmp_temps) |owned, temp| if (owned) try temp.die(cg); |
| | 190198 | for (dst_tys, case.dst_temps[0..dst_temps.len], dst_temps) |dst_ty, dst_kind, *dst_temp| try Select.TempSpec.finish(.{ .type = dst_ty, .kind = dst_kind }, dst_temp, cg); |
| 189400 | return; | 190199 | return; |
| 189401 | } | 190200 | } |
| 189402 | } | 190201 | } |