59 void force_set_reg(AsmReg reg) noexcept { this->reg = reg; }
62template <IRAdaptor Adaptor,
typename Derived, CompilerConfig Config>
64 ScratchReg &&other)
noexcept {
65 this->compiler = other.compiler;
66 this->reg = other.reg;
67 other.reg = AsmReg::make_invalid();
70template <IRAdaptor Adaptor,
typename Derived, CompilerConfig Config>
71typename CompilerBase<Adaptor, Derived, Config>::ScratchReg &
72 CompilerBase<Adaptor, Derived, Config>::ScratchReg::operator=(
73 ScratchReg &&other)
noexcept {
79 this->compiler = other.compiler;
80 this->reg = other.reg;
81 other.reg = AsmReg::make_invalid();
85template <IRAdaptor Adaptor,
typename Derived, CompilerConfig Config>
86typename CompilerBase<Adaptor, Derived, Config>::AsmReg
88 AsmReg reg)
noexcept {
89 assert(compiler->may_change_value_state());
90 assert(!compiler->register_file.is_fixed(reg));
93 if (compiler->register_file.is_used(reg)) {
94 compiler->evict_reg(reg);
97 compiler->register_file.mark_used(reg, INVALID_VAL_LOCAL_IDX, 0);
98 compiler->register_file.mark_clobbered(reg);
99 compiler->register_file.mark_fixed(reg);
104template <IRAdaptor Adaptor,
typename Derived, CompilerConfig Config>
105CompilerBase<Adaptor, Derived, Config>::AsmReg
107 RegBank bank)
noexcept {
108 assert(compiler->may_change_value_state());
110 auto ®_file = compiler->register_file;
111 if (!reg.invalid()) {
112 assert(bank == reg_file.reg_bank(reg));
116 reg = compiler->select_reg(bank, 0);
117 reg_file.mark_used(reg, INVALID_VAL_LOCAL_IDX, 0);
118 reg_file.mark_clobbered(reg);
119 reg_file.mark_fixed(reg);
123template <IRAdaptor Adaptor,
typename Derived, CompilerConfig Config>
129 compiler->register_file.unmark_fixed(reg);
130 compiler->register_file.unmark_used(reg);
131 reg = AsmReg::make_invalid();