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) {}
43 ValueAssignment *assignment() {
return va; }
45 [[nodiscard]] RegBank bank()
const {
46 return RegBank((va->parts[part] >> 5) & 0b111);
49 void set_bank(
const RegBank bank) {
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 {
return Reg(va->parts[part] & 0xFF); }
58 void set_reg(Reg reg) {
59 assert(bank().
id() == ((reg.id() >> 5) & 0b111));
60 va->parts[part] = (va->parts[part] & 0xFF00) | reg.id();
63 [[nodiscard]]
bool modified()
const {
64 return (va->parts[part] & (1u << 9)) != 0;
67 void set_modified(
const bool val) {
69 va->parts[part] |= (1u << 9);
71 va->parts[part] &= ~(1u << 9);
75 [[nodiscard]]
bool fixed_assignment()
const {
76 return (va->parts[part] & (1u << 8)) != 0;
79 void set_fixed_assignment(
const bool val) {
81 va->parts[part] |= (1u << 8);
83 va->parts[part] &= ~(1u << 8);
87 [[nodiscard]]
bool variable_ref()
const {
return va->variable_ref; }
89 [[nodiscard]]
bool is_stack_variable()
const {
return va->stack_variable; }
91 [[nodiscard]]
bool register_valid()
const {
92 return (va->parts[part] & (1u << 11)) != 0;
95 void set_register_valid(
const bool val) {
97 va->parts[part] |= (1u << 11);
99 va->parts[part] &= ~(1u << 11);
103 [[nodiscard]]
bool stack_valid()
const {
104 return (va->parts[part] & (1u << 9)) == 0;
107 void set_stack_valid() { set_modified(
false); }
109 [[nodiscard]] uint32_t part_size()
const {
110 return 1u << ((va->parts[part] >> 12) & 0b111);
113 void set_part_size(
const uint32_t part_size) {
114 assert((part_size & (part_size - 1)) == 0);
115 const uint32_t shift = util::cnt_tz(part_size);
116 assert(shift <= 0b111);
117 auto data = va->parts[part] & ~(0b111 << 12);
118 data |= (shift << 12);
119 va->parts[part] = data;
122 [[nodiscard]] int32_t frame_off()
const {
123 assert(!variable_ref());
124 assert(va->frame_off != 0 &&
"attempt to access uninitialized stack slot");
125 return va->frame_off + part_off();
128 [[nodiscard]] int32_t variable_stack_off()
const {
129 assert(variable_ref() && va->stack_variable);
131 return va->frame_off;
134 [[nodiscard]] uint32_t variable_ref_data()
const {
135 assert(variable_ref() && !va->stack_variable);
137 return va->var_ref_custom_idx;
140 [[nodiscard]] uint32_t part_off()
const {
return va->max_part_size * part; }