6#include "tpde/RegisterFile.hpp"
7#include "tpde/ValueAssignment.hpp"
13class AssignmentPartRef {
35 AssignmentPartRef(ValueAssignment *va,
const uint32_t part)
36 : va(va), part(part) {}
38 void reset() noexcept {
43 ValueAssignment *assignment() noexcept {
return va; }
45 [[nodiscard]] RegBank bank() const noexcept {
46 return RegBank((va->parts[part] >> 5) & 0b111);
49 void set_bank(
const RegBank bank)
noexcept {
50 assert(bank.id() <= 0b111);
51 auto data = va->parts[part] & ~0b1110'0000;
52 data |= bank.id() << 5;
53 va->parts[part] = data;
56 [[nodiscard]] Reg get_reg() const noexcept {
57 return Reg(va->parts[part] & 0xFF);
60 void set_reg(Reg reg)
noexcept {
61 assert(bank().
id() == ((reg.id() >> 5) & 0b111));
62 va->parts[part] = (va->parts[part] & 0xFF00) | reg.id();
65 [[nodiscard]]
bool modified() const noexcept {
66 return (va->parts[part] & (1u << 9)) != 0;
69 void set_modified(
const bool val)
noexcept {
71 va->parts[part] |= (1u << 9);
73 va->parts[part] &= ~(1u << 9);
77 [[nodiscard]]
bool fixed_assignment() const noexcept {
78 return (va->parts[part] & (1u << 8)) != 0;
81 void set_fixed_assignment(
const bool val)
noexcept {
83 va->parts[part] |= (1u << 8);
85 va->parts[part] &= ~(1u << 8);
89 [[nodiscard]]
bool variable_ref() const noexcept {
return va->variable_ref; }
91 [[nodiscard]]
bool is_stack_variable() const noexcept {
92 return va->stack_variable;
95 [[nodiscard]]
bool register_valid() const noexcept {
96 return (va->parts[part] & (1u << 11)) != 0;
99 void set_register_valid(
const bool val)
noexcept {
101 va->parts[part] |= (1u << 11);
103 va->parts[part] &= ~(1u << 11);
107 [[nodiscard]]
bool stack_valid() const noexcept {
108 return (va->parts[part] & (1u << 9)) == 0;
111 void set_stack_valid() noexcept { set_modified(
false); }
113 [[nodiscard]] uint32_t part_size() const noexcept {
114 return 1u << ((va->parts[part] >> 12) & 0b111);
117 void set_part_size(
const uint32_t part_size)
noexcept {
118 assert((part_size & (part_size - 1)) == 0);
119 const uint32_t shift = util::cnt_tz(part_size);
120 assert(shift <= 0b111);
121 auto data = va->parts[part] & ~(0b111 << 12);
122 data |= (shift << 12);
123 va->parts[part] = data;
126 [[nodiscard]] int32_t frame_off() const noexcept {
127 assert(!variable_ref());
128 assert(va->frame_off != 0 &&
"attempt to access uninitialized stack slot");
129 return va->frame_off + part_off();
132 [[nodiscard]] int32_t variable_stack_off() const noexcept {
133 assert(variable_ref() && va->stack_variable);
135 return va->frame_off;
138 [[nodiscard]] uint32_t variable_ref_data() const noexcept {
139 assert(variable_ref() && !va->stack_variable);
141 return va->var_ref_custom_idx;
144 [[nodiscard]] uint32_t part_off() const noexcept {
145 return va->max_part_size * part;